1. ArrayLsit 和 LinkedList的区别
ArrayList | LinkedList |
---|---|
基于数组实现,在内存空间是连续的 | 基于链表实现,在内存空间是分散的 |
查找和添加效率高 | 插入和删除效率高 |
是非线程安全的数据结构 | 也是非线程安全的数据结构 |
2. ArrayList和Array数组的区别
ArrayList | Array数组 |
---|---|
只能存放引用数据类型 | 既能存放基础数据类型也能存放引用数据类型 |
动态扩容,无需在创建时指定容量 | 固定容量,在创建时必须指定容量 |
提供了很多方便的如add,remove,set,get方法 | 没有提供 |
3. 讲讲ArrayList的扩容机制
当使用无参构造方法创建ArrayList时,ArrayList的初始容量为0,elementData指向一个空数组。当第一次开始调用add()时,才会进行扩容,初始容量为10
。随后每次调用add()时都会判断容量是否充足,若不足则会创建一个为原来容量的1.5倍
的数组,然后再将旧的数组拷贝到新的数组中去完成扩容。
- 核心grow方法
/**
* 要分配的最大数组大小
*/
private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;
/**
* ArrayList扩容的核心方法。
*/
private void grow(int minCapacity) {
// minCapacity为最小所需容量,oldCapacity为旧容量,newCapacity为新容量
int oldCapacity = elementData.length;
//将oldCapacity 右移一位,其效果相当于oldCapacity /2,即将新容量设置为旧容量的1.5倍
int newCapacity = oldCapacity + (oldCapacity >> 1);
//然后检查新容量是否大于最小需要容量,若还是小于最小需要容量,那么就把最小需要容量当作数组的新容量(初始化容量时)
if (newCapacity - minCapacity < 0)
newCapacity = minCapacity;
// 如果新容量大于 MAX_ARRAY_SIZE,进入(执行) `hugeCapacity()` 方法来比较 minCapacity 和 MAX_ARRAY_SIZE,
//如果minCapacity大于最大容量,则新容量则为 `Integer.MAX_VALUE`,
//否则,新容量大小则为 `Integer.MAX_VALUE - 8`
if (newCapacity - MAX_ARRAY_SIZE > 0)
newCapacity = hugeCapacity(minCapacity);
// minCapacity is usually close to size, so this is a win:
elementData = Arrays.copyOf(elementData, newCapacity);
}
2021年6月24日10:08:34 持续更新…