Java集合

参考https://javaguide.cn/

ArrayList

构造函数

  1. 校验初始容量
  2. 如果是无参构造,那么还是赋值一个空的数组,但是插入的时候会辨别;反之则构造一个空的数组DEFAULTCAPACITY_EMPTY_ELEMENTDATA,但是下次扩容会取最小扩容量与默认初始化长度(一般为10)进行比较。

扩容过程

add函数

校验大小获取最少需要长度通常是插入数量+当前长度,

grow函数

如果不够就进行扩容,并确定扩容大小,每次扩容变成原来的1.5倍,0.5倍由无符号右移一位得到,新长度有最少需要长度与原来长度的1.5倍的最大值得到,但是不超过SOFT_MAX_ARRAY_LENGTH,该值为Int的最大值-8,是由于部分java虚拟机需要存放object header会导致堆栈溢出,Java中的对象头信息(数组长度)需要占用8个字节的空间,所以选择了个略小于最大值的值。


Java问题收集

理解原码、反码、补码、移码

  • 符号位:0位正数,1为负数

  • 原码不能进行运算

  • 正数的原码和反码一样,负数的反码是在原码的基础上,符号位不变,其余取反

  • 正数的补码和反码一样,负数的补码是在反码的基础上进行+1操作

  • 移码是在补码的基础上,把符号位取反

1 -1 1+(-1) 结果
原码 0000 0001 1000 0001 1000 0010 -2
反码 0000 0001 1111 1110 1111 1111 -0
补码 0000 0001 1111 1111 0000 0000 +0
移码 1000 0001 0111 1111 1000 0000 0

取值范围

整数 n=8
原码 -(2^(n-1)-1)~2^(n-1)-1 -127~127
反码 -(2^(n-1)-1)~2^(n-1)-1 -127~127
补码 -2^(n-1)~2^(n-1)-1 -128~127

Object

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
/**
* native 方法,用于返回当前运行时对象的 Class 对象,使用了 final 关键字修饰,故不允许子类重写。
*/
public final native Class<?> getClass()
/**
* native 方法,用于返回对象的哈希码,主要使用在哈希表中,比如 JDK 中的HashMap。
*/
public native int hashCode()
/**
* 用于比较 2 个对象的内存地址是否相等,String 类对该方法进行了重写以用于比较字符串的值是否相等。
*/
public boolean equals(Object obj)
/**
* native 方法,用于创建并返回当前对象的一份拷贝。
*/
protected native Object clone() throws CloneNotSupportedException
/**
* 返回类的名字实例的哈希码的 16 进制的字符串。建议 Object 所有的子类都重写这个方法。
*/
public String toString()
/**
* native 方法,并且不能重写。唤醒一个在此对象监视器上等待的线程(监视器相当于就是锁的概念)。如果有多个线程在等待只会任意唤醒一个。
*/
public final native void notify()
/**
* native 方法,并且不能重写。跟 notify 一样,唯一的区别就是会唤醒在此对象监视器上等待的所有线程,而不是一个线程。
*/
public final native void notifyAll()
/**
* native方法,并且不能重写。暂停线程的执行。注意:sleep 方法没有释放锁,而 wait 方法释放了锁 ,timeout 是等待时间。
*/
public final native void wait(long timeout) throws InterruptedException
/**
* 多了 nanos 参数,这个参数表示额外时间(以毫微秒为单位,范围是 0-999999)。 所以超时的时间还需要加上 nanos 毫秒。。
*/
public final void wait(long timeout, int nanos) throws InterruptedException
/**
* 跟之前的2个wait方法一样,只不过该方法一直等待,没有超时时间这个概念
*/
public final void wait() throws InterruptedException
/**
* 实例被垃圾回收器回收的时候触发的操作
*/
protected void finalize() throws Throwable { }

深拷贝和浅拷贝

引用拷贝:只是复制引用地址

浅拷贝:将object对象在堆上复制一份对象,但是里面如果有引用对象的话,也只会复制地址

深拷贝:将object对象全部复制,包括内部对象。

String

Java 9 为何要将 String 的底层实现由 char[] 改成了 byte[] ?

JEP 254: 紧凑字符串 (openjdk.org)

我们建议更改类的内部表示 从 UTF-16 数组到数组加上编码标志字段。 新类将存储编码为 ISO-8859-1/Latin-1(每个字符一个字节),或 UTF-16(每个字符两个字节) 字符)