· 我们都知道boolean add(E e)是尾插一个e,但如果空间不够怎么办??这个方法又是怎么实现扩容的涅??扩多少??今天我们就把他扒开瞅瞅!!!
实现代码:
public boolean add(Ee){
ensureCapacityInternal(minCapacity:size+1);//IncrementsmodCount!!
elementData[size++]=e;
returntrue;
}
点进ensureCapacityInternal方法,代码如下👇
private void ensureExplicitCapacity(int minCapacity) {
modCount++;
// overflow-conscious code
if (minCapacity - elementData.length > 0) //minCapacity是加入新元素之后有效元素长度 elementData是现有的List
grow(minCapacity);
}
if判断条件若为真,则调用grow方法进行扩容
(要清楚minCapacity是传进来的(size+1),是加入新元素之后有效元素长度 elementData是现有的List的长度)
grow方法实现(扩容机制)👇
private void grow(int minCapacity) {
// overflow-conscious code
int oldCapacity = elementData.length;
int newCapacity = oldCapacity + (oldCapacity >> 1);//扩容阔的是原容量的1.5倍
if (newCapacity - minCapacity < 0)
newCapacity = minCapacity;
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);
}
通过**int newCapacity = oldCapacity + (oldCapacity >> 1);**我们可以看出,扩容阔的是原容量的1.5倍。
加油鸭~