Java学习记录

Java快速入门

Java基本知识

  • Java 最大的特点跨平台

  • JavaSE(个人版)、JavaEE(企业版)、JavaME(微型版,用于消费电子产品开发)

  • Java地位类似Windows

Java运行机制

  • 运行流程:源文件(.java)---[Javac编译器]--->字节码(.class)---[JVM虚拟机]--->可执行程序

  • JDK JRE JVM之间的关系

    JDK(Java Development Kit)

    ​ 调试器、编译器(javac)

    JRE(Java Runtime Environment)

    ​ 库函数

    JVM(Java Virtual Mechine)

Java方法

方法的重载

定义:名字相同,参数不同(要求功能类似)

int add(){...}; int add(int a){...}

面向对象

  • 对象类似表格,由属性和方法组成
  • 面向对象是一种设计者思维,组装

内存机制

  • 栈:负责函数运行,main开始
  • 堆:负责存储对象部分
  • 方法区:负责存储类的不变部分(方法、常量)

垃圾回收机制

原理:

  • Java的内存管理很大部分是堆中对象的释放
  • 堆分为3个部分:年轻代(Eden区+Survivor1区+Survivor2区)、年老代、永久代(元数据空间)
  • 有3种回收器:Mini GC(负责年轻代)、Major GC(负责年老代)、Full GC(全部都可以负责)
  • System.gc()可以建议系统进行垃圾回收

算法:

  • 引用计数法
  • 引用可达法

静态和普通

普通属性、普通方法有this指针(隐式参数),区分和局部变量相同的普通属性,如this.a=a,再构造函数中调用重载的构造函数时显示使用,如

Test(int a, int b){
    this.Test(a);
    ...
}

静态属性、静态方法没有this指针,有静态构造方法,用于静态属性的初始化,即

static{
    ...
}

package 和 import

package作用就是对类进行分类存放,使其有条理性,一定程度上解决类同名问题。

import导入有两种

  • 导入类
import java.lang.Math; //导入java.lang.Math类
import java.lang.*; //导入java.lang包下的所有类
  • 导入静态变量或者静态方法
import java.lang.Math.PI; //导入PI静态变量
import java.lang.Math.random; //导入random()静态方法
import java.lang.Math.*; //导入Math类下所有静态变量和方法

重写Override

要求:

  • ==:方法名、形参列表相同
  • <=:返回值类型、声明异常类型,子类小于等于父类
  • >=:访问权限,子类大于等于父类

组合

对象持有另一个对象

封装

目的

  • 高内聚、低耦合:高内聚指的类内部数据操作细节自己完成,不允许外部干涉;低耦合指的是仅暴露少量的方法给外部使用,尽量方便外部调用。举例:手机高内聚,所有的实习细节都封装在手机壳里面,并且独立运行,手机也是低耦合,对外部只有屏幕、充电口、开关、音量调节按钮而已。

实现

  • private: 类内友好

  • (default): 包内友好

  • protected: 包内友好、父子友好

  • public: 全局友好

get set方法

封装的一般方法是将属性都设置为private,然后外部通过set get函数进行访问。

多态

同一个方法,不同对象调用方法完全不同

对象类型转化

  • 向上转化(子类转化为父类): 自动转化
  • 向下转化(父类转化为子类): 强制转化,(子类类型)对象

抽象类

抽象方法:只有方法名没有实现,前面加abstract。

含有抽象方法的类就是抽象类,抽象类不能产生对象,子类必须实现抽象父类的抽象方法。

接口

基本格式:

控制符 interface 接口名 [extends 接口1, 接口2, ...]{
    //常量
    /*public abstract final*/数据类型 变量名 = 值;
    //抽象方法
    /*public abstract*/返回类型 方法名(形参列表);
    //默认方法
    default 返回类型 方法名(形参列表){...}
}

接口是一种规则,需要类来实现.

内部类

内部类是为了封装而生的,是编译才有的概念

有4种内部类:

  • 成员内部类

    • 非静态内部类

    • 静态内部类

  • 匿名内部类

只使用一次,所以不需要名字

  • 局部内部类

在方法中定义类

数组

数组的创建

数组的初始化

  • 静态初始化
  • 动态初始化
  • 默认初始化

数组的常用操作

数组遍历

  • for(int i=0; i < array.length; ++i)
    
  • for(int i:array)
    

数组拷贝

数组的打印、排序、查找、填充

利用Array类中的方法

  • 打印: Array.toString(数组对象)

  • 排序: Array.sort(数组对象),该类数组对象需要实现comparable接口,comparable中有compareTo()方法需要实现

  • 查找: Array.binarySearch(数组对象,查找元素)

  • 填充: Array.fill(数组对象, 开始pos, 结束pos, 填充元素)

二维数组

即数组的数组

总结

  • JDK、JRM、JVM的包含关系

  • .java --javac-->.class--JVM-->可执行文件

  • 基本数据类性,引用类型 (基本数据类型也有对应的应用类型)

  • 类和对象

  • pacakage 包名;
    
    import 包名.类名(*);
    import static 包名.类名.静态方法;
    
    /*
    类的成员有属性、方法、内部类
    类和成员都有修饰符:
       1.public protected default private
       2.static final abstract
    */
    
    public class 类名(和文件名一致) [extends 父类名]{
        //属性
        //构造方法
        修饰符 构造方法(形参列表){
            
        }
        //方法
        
        //静态内部类
        public static class A{
            //静态成员
        }  
        
        //非静态内部类
        public class B{
            
        } 
    }
    
    
  • 类和对象的存储(JVM内存模型)

    • 栈(存放方法,从main方法开始)
    • 堆(对象)
    • 方法区(方法、静态成员、常量池)
  • 接口

    public interface 接口名 [extends 接口1, 接口2, ...]{
        [public static final] 类型名 属性名 = 值;
        [public abstract] 返回类型名 方法名(参数列表);
        
        //补充默认方法
        default 返回类型名 方法名(形参列表);
        
        //补充静态方法
        static 返回类型名 方法名(形参列表);
    }
    
  • 封装

    public protected (default) private 的作用范围

  • 继承

    • 类继承 (单) 接口继承(可多)
    • super
    • 重写 @Override
  • 多态

Java 基础深化与提高

泛型与泛型类

容器

基本结构

  • Collection接口

    • Set接口

      • HashSet类
      • LinkedHashSet类
      • TreeSet类
    • List接口

      • ArrayList类
      • LinkedList类
      • Vector类
  • Map接口

    • HashMap类
    • LinkedHashMap类
    • TreeMap类
    • Properties类
    • HashTable类

Collections接口

//查看基本信息
int size();
boolean isEmpty();
//增删操作
boolean add(Object element);
boolean addAll(Collections c);
boolean remove(Object element);
boolean removeAll(Collections c);
boolean retainAll(Collections c); //只保留与容器c交集的元素
void clear();
//查看
boolean contains(Object element); //是否包含某个元素
boolean containsAll(Collections c);
//迭代器
Iterator iterator(); //返回迭代器,用于容器遍历
//转化
Object[] toArray();  

List接口

特点:有序+可重复

//增加操作
boolean add(int index, Object element);
//删除操作
boolean remove(int index);
//修改操作
boolean set(int index, Object element);
//查看/查找
Object get(int index);
int indexOf(Object element);
int lastIndexOf(Object element);

ArrayList类

特点:

  • 通过数组实现,所以查找效率高,增删操作效率低
  • 线程不安全

IO

基本概念

输入输出流

  • 输入流:程序外部-->内部
  • 输出流:程序内部-->外部

数据源

  • 源设备:发送数据的设备
  • 目标设备:接受数据的设备

节点流、处理流(包装流):流像管子一样,可以嵌套

  • 节点流:直接链接数据源的流
  • 处理流:包装其他流的流

4大IO抽象类

字节

  • InputStream

方法:

int read(); //字节读取,读取成功则返回0-255的十进制数,读取失败则返回-1
void close(); //关闭流

·子类:

节点流:
FileInputStream;  //操作文件
ByteArrayInputStream; //操作字节数组
处理流:
ObjectInputStream; //操作对象
DataInputStream; //操作基本数据类型和字符串类型
BufferdInputStream; //增加缓存功能,提供效率
  • OutputStream

方法:

void write(int ); //写入一个字节
void close(); //关闭流

子类:

节点流:
FileOuputStream;
ByteArrayOuputStream;
处理流:
ObjectOutputStream;
DataOutputStream;
BufferedOutputStream;
PrintStream;

字符

  • Reader

方法:

int read(); //字符读取,读取成功则返回0-65535的十进制数,读取失败则返回-1
void close(); //关闭流

子类:

节点流:
FileReader;
处理流:
BufferedReader;
  • Writer

方法:

void write(int ); //写入一个字符
void close(); //关闭流

方法:

节点流:
FileWriter;
处理流:
BufferedWriter;

File类

File类是处理磁盘文件或者目录的包装类

方法:

//初始化
File(String path); //相对路径获取方式System.Property("user.dir");
//创建文件/目录
boolean createNewFile();
boolean mkdir();
boolean mkdirs();
//删除文件
boolean delete();
//操作
String getPath();
...

多线程

基本概念

  • 程序:可执行文件(静态的),一般放在磁盘,需要时在拿到内存运行;

  • 进程:进程是程序在内存上的一次运行,独占了一块内存空间,由若干个线程(至少1个)、code、数据构成;

  • 线程:线程是运行在进程内的一个线性执行单元,同个进程内线程之间共享数据(出现共享互斥问题)

  • 主线程:由main方法开始的线程

  • 子线程:由main方法创建的新线程

java中的线程

Thread

Runnable

线程控制

  • 线程结束
  • 线程暂停
    • sleep(long s); 进入阻塞状态,并在一定时间后回到就绪状态
    • yeild();进入就绪状态,给同优先级的其他线程让cpu资源

线程联合

join函数,被加入的线程需要等待加入线程运行完毕后才能运行

线程优先级

t.setPriority(5);
t.start();
System.out.println(t.getPriority());

守护线程

线程分为用户线程和守护线程,守护线程用来服务于用户线程,比如垃圾回收,用户线程死亡则守护线程也死亡。

线程同步

线程同步的基本知识
线程同步的java实现
  • 成员变量
synchronized(成员变量对象名){
    //需要同步的代码块
}
  • this
synchronized(this){
    //需要同步的代码块
}

synchronized public void func(){
    
}
  • 类名.class
synchronized(类名.class){
    //需要同步的代码块
}

synchronized public static void func(){
    //需要同步的代码块
}

线程的并发协作

模型:生产者(线程) -->[缓冲区]-->消费者(线程)

作用

  • 逻辑上实现生存者线程和消费者线程的分离,解除了他们之间的耦合
  • 协调了生产者线程和消费者线程之间的速度,提高效率

线程之间的通信

  • wait
  • notify
  • notifyAll

通信+syn机制才能实现生产者消费者模型

网络编程

基本概念

计算机网络

将不同地方的计算机通过通信线路链接起来,在网络操作系统网络管理软件网络通信协议的管理和协调下,实现计算机的资源共享和信息通信的系统

网络通信协议

  • 协议:标准、规则,类似人类之间的交流需要共同的语言,计算机之间的信息交流也需要同一套规则。
  • 计算机通信太复杂,于是进行了分层,有IOS模型(理论)和TCP/IP模型(工业),每个层都有对应的协议。
  • 在模型的指导下,计算机之间的通信时层层包装(发送方)再层层拆分(接收方)的过程。

数据的(拆分)封装与解封(合并)

why:数据量太大很难一次传输,需要分段后按照次序发送;

what:发送方将数据层层拆分和封装,直到物理媒体传输,接送方对受到的数据进行拆分

how:因为每一层封装和解封都是一个原理,所以我们这里只讨论某一层。第i层的作用是传输i+1层提供的数据,发送方把上层来的数据PUD先拆分再包装,利用下层建立好的服务传送,接收方接受到数据后再合并起来。

IP地址和端口号

  • IP: 标识计算机
  • 端口号:标识服务

URL

构成:https(协议)😕/www.baidu.com(域名)[端口号]/index.html(文件)

作用:标识计算机的资源(目录、文件、复杂对象的引用)

Socket

作用:在应用层和传输层之间创建了桥梁,是传输层提供的编程接口,使得应用程序可以进行网络通信

TCP UDP

TCP

位于传输层,可靠传输方式,建立虚拟链路,断开虚拟链路,类似打电话.

3次握手,4次挥手

UDP

位于传输层,不可靠传输,类似于发短信

Java网络编程中的常用类

Socket的编程循序

  • 服务器创建ServerSocket对象,设置好监听接口;

  • ServerSocket对象调用accept()方法,并使之处于阻塞状态,等待客户端的链接;

  • 客户端创建Socket对象,设置好要连接服务器的IP和Port;

  • 客户端发出请求,客户端和服务器建立链接;

  • 通过Socket对象获得客户端和服务器的建InputStream和OutStream流对象;

  • 客户端和服务器之间利用流传输数据;

  • 关闭流关闭Socket对象

  • 信息:岗位是有限的,太晚就没了,所以要把握好时间,字节那两次机会要快一点,预计3月20号前投一次

  • 面试或者面试失败会有危险吗,不会,反而有益,锻炼胆量,学到面试经验,还是很不错的!所以不要害怕,大胆面试

posted @ 2022-03-07 18:43  爱弹琴的小黑  阅读(40)  评论(0编辑  收藏  举报