-
ArrayList 底层是用数组实现的存储。
-
特点:
- 查询效率高,增删效率低
- 线程不安全
- 使用频率很高
核心api
- add()
-
先确保数组有足够的容量存放元素:
ensureCapacityInternal(int minCapacity)
-
先计算本次add需要的容量:
calculateCapacity(Object[] elementData, int minCapacity)
有两种情况:
- 若ArrayList是通过无参构造产生的,需要进入if判断,默认初始化的大小是10,返回默认初始化大小和需要的数组大小中较大的那个
- 否则直接返回需要的容量
-
确保数组能存放上一步
calculateCapacity
计算的容量:ensureCapacityInternal(int minCapacity)
若要求的容量大于当前数组长度,则进行扩容
-
扩容函数:
grow(int minCapacity)
-
通过
newCapacity = oldCapacity + (oldCapacity >> 1)
1.5倍扩容原数组,若扩容后的数组大小还是小于需要的容量,则直接将需要的容量作为新数组大小 -
若新数组大小 大于 最大数组大小,调用
hugeCapacity(minCapacity);
进行扩容- 若 minCapacity 溢出抛出异常
- 否则返回 Integer.MAX_VALUE
-
若新数组大小 不大于 最大数组大小,直接调用
Arrays.copyOf(elementData, newCapacity);
对数组进行扩容后移动数据并返回新数组给elementData
-
-
-