Java知识点整理1-Java基础

一、Java基础

1. 接口和抽象类的区别

  • 所有方法在接口中不能有实现(Java8开始可以有默认实现,同时可以有静态方法),抽象类可以有非抽象的方法。
  • 接口中除了static、final变量,不能有其他变量,抽象类则不一定。
  • 一个类可以实现多个接口,而只能实现一个抽象类。接口自身可以通过extends扩展多个接口。
  • 接口方法默认修饰符是public,抽象方法可以有public、protected和default修饰符(不能用private)。
  • 抽象是对类的抽象,是一种设计模板,而接口是对行为的抽象,是一种行为的规范。

2. hashCode()和equals()

  • 未创建类对应的散列表时,重写equals()时,不需要重写hashCode()。
  • 会创建类对应的散列表时,重写equals()时,需要重写hashCode(),否则equals()无效。散列表中判断是否相等时,会先调用hashCode()获取哈希值,如果哈希值相等再调用equals()。

3. 装箱拆箱

https://www.cnblogs.com/dolphin0520/p/3780005.html

  • 基本类型装箱自动调用Integer的valueOf(int)方法,拆箱自动调用Integer的intValue方法。
  • 当"=="运算符的两个操作数都是包装器类型的引用,则是比较指向的是否是同一个对象,而如果其中有一个操作数是表达式(即包含算术运算)则比较的是数值(即会触发自动拆箱的过程)。另外,对于包装器类型,equals方法并不会进行类型转换。
    相关例题:
public class Main {
    public static void main(String[] args) {
         
        Integer i1 = 100;
        Integer i2 = 100;
        Integer i3 = 200;
        Integer i4 = 200;
         
        System.out.println(i1==i2);
        System.out.println(i3==i4);
    }
}

true
false
valueOf方法创建Integer对象时,如果数值在[-128,127]之间,便返回IntegerCache.cache中已经存在的对象的引用,否则创建一个新的Integer对象。
2.

public class Main {
    public static void main(String[] args) {
         
        Double i1 = 100.0;
        Double i2 = 100.0;
        Double i3 = 200.0;
        Double i4 = 200.0;
         
        System.out.println(i1==i2);
        System.out.println(i3==i4);
    }
}

false
false
Double类的valueOf实现与Integer的不一样。
3.

public class Main {
    public static void main(String[] args) {
         
        Boolean i1 = false;
        Boolean i2 = false;
        Boolean i3 = true;
        Boolean i4 = true;
         
        System.out.println(i1==i2);
        System.out.println(i3==i4);
    }
}

true
true
4. Integer i = new Integer(xxx)和Integer i =xxx 的区别

  • 第一种不会触发自动装箱;第二种会触发。
  • 第二种方式的执行效率和资源占用在一般性情况下要优于第一种情况。

4. Java只有值传递

  1. 一个方法不能修改一个基本数据类型的参数。
  2. 一个方法可以改变一个对象参数的状态(方法得到的是对象引用的拷贝,对象引用及其他的拷贝引用同一个对象)。
  3. 一个方法不能让对象参数引用一个新的对象。

5. 进程和线程

  • 进程是程序的一次执行过程,是系统运行程序的基本单位。线程是比进程跟小的执行单位,一个进程可以产生多个线程。
  • 每个进程占用独立的内存空间和系统资源。多个线程共享同一块内存空间和一组系统资源。

6. 线程的基本状态

  1. new
  2. runnable(操作系统看到的状态,jvm中分为ready和running状态)
  3. blocked
  4. waiting
  5. time_waiting
  6. terminated

7. final关键字

final关键字主要用在三个地方:变量、方法、类

  • 变量:如果是基本数据类型的变量,则初始化之后不能更改;如果是引用类型的变量,则初始化后不能再指向另一个对象。
  • 类:表明这个类不能被继承。final类中的所有成员方法都会被隐式地指定为final方法。
  • 方法:1. 锁定方法,防止继承类修改它的含义。2. 效率(现在版本不适用)。类中所有的private方法都隐式地指定为final。

8. 键盘输入

  • Scanner
Scanner input = new Scanner(System.in);
String s  = input.nextLine();
input.close();
  • BufferedReader
BufferedReader input = new BufferedReader(new InputStreamReader(System.in));
String s = input.readLine();

9. 字符流的意义

Java虚拟机转换字节流到字符流非常耗时,且容易因为不知道编码类型而产生乱码。

10. BIO, NIO, AIO的区别

  • BIO(Blocking I/O):同步阻塞I/O模式。在连接数不高的情况下(小于单机1000),比较适用。
  • NIO(Non-blocking/New I/O):同步非阻塞I/O模型。Java1.4引入NIO,对应Java.nio包,提供了Channel,Selector,Buffer等抽象。NIO支持面向缓冲的,基于通道的I/O操作方法,提供了SocketChannel和ServerSocketChannel两种不同的套接字通道实现,都支持阻塞和非阻塞两种模式。NIO阻塞模式性能和可靠性不好,不推荐使用。非阻塞模式适用于高负载、高并发的(网络)应用。
  • AIO(Asynchronous I/O):也就是NIO2。Java7引入了NIO2,是异步非阻塞的I/O模型。是基于事件和回调机制实现的。使用较少。

11. 浅拷贝和深拷贝

  • 浅拷贝:仅复制对象,不复制它所引用的对象。
  • 深拷贝:不仅复制对象,还复制它所引用的对象。

你可能感兴趣的:(读书笔记)