java之ArrayList底层扩容机制解读

ArrayList底层使用Object[] elementData存储,其默认长度DEFAULT_CAPACITY = 10.

在底层中还有属性size作为指针将add的元素存入elementData数组的size++对应角标下中:

public boolean add(E e) {
ensureCapacityInternal(size + 1); // Increments modCount!!
elementData[size++] = e;
return true;
}

 

 当涉及add,addAll,clear,remove,fastRemove等相关操作时就会改动size的指向。

在add方法中有ensureCapacityInternal()方法,进行扩容操作。当size+1值大于elementData数组的长度就会开始发生作用:

private void ensureCapacityInternal(int minCapacity) {
ensureExplicitCapacity(calculateCapacity(elementData, minCapacity));
}
其中calculateCapacity()方法就是为elementData数组赋初始长度(DEFAULT_CAPACITY)的,其中DEFAULTCAPACITY_EMPTY_ELEMENTDATA是一个空数组为初始化数组服务
private static int calculateCapacity(Object[] elementData, int minCapacity) {
if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
return Math.max(DEFAULT_CAPACITY, minCapacity);
}
return minCapacity;
}
初始化后,数组长度不够就调用ensureExplicitCapacity()方法,进而扩容【grow()】:
private void ensureExplicitCapacity(int minCapacity) {
modCount++;

// overflow-conscious code
if (minCapacity - elementData.length > 0)
grow(minCapacity);
}
最后的扩容机制: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);
}
oldCapacity是原数组长度,当原数组长度小于newCapacity就创建一个新数组其长度为newCapacity,并将原数组元素赋给新数组。






posted @ 2021-11-14 17:31  新游  阅读(115)  评论(0)    收藏  举报