1)直接new 一个ArrayList对象时(未指定初始容量大小)是一个空的数组,容量大小为零。
public ArrayList() {
// DEFAULTCAPACITY_EMPTY_ELEMENTDATA 变量为一个空的数组 private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};
this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
}
2)、当第一次调用ArrayList对象的add方法时,分配容量大小
public boolean add(E e) {
// size 为ArrayList的实际数量大小而非容量大小,如果未指定容量构建的ArrayList对象此时size对象应该为0
ensureCapacityInternal(size + 1); // Increments modCount!!
elementData[size++] = e;
return true;
}
private void ensureCapacityInternal(int minCapacity) {
// 如果为空数组,最小需要容量为默认最小容量DEFAULT_CAPACITY 也就是10 private static final int DEFAULT_CAPACITY = 10;
if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
minCapacity = Math.max(DEFAULT_CAPACITY, minCapacity);
}
// 调用扩容方法
ensureExplicitCapacity(minCapacity);
}
private void ensureExplicitCapacity(int minCapacity) {
modCount++;
// 如果最小的需要容量大于此时的容量,调用真正的扩容方法
// overflow-conscious code
if (minCapacity - elementData.length > 0)
grow(minCapacity);
}
private void grow(int minCapacity) {
// overflow-conscious code
int oldCapacity = elementData.length;
// 第一次扩容1.5倍
int newCapacity = oldCapacity + (oldCapacity >> 1);
// 还是比需要的容量小就把需要的容量作为新的容量值
if (newCapacity - minCapacity < 0)
newCapacity = minCapacity;
// 如果此时的新的容量比最大容量还大则比较需求容量和数组最大容量的大小,
如果比最大容量大就赋值为整数最大值,反之赋值为最大容量。
这里主要防止1.5倍扩容导致新容量值超过数组最大容量
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);
}
private static int hugeCapacity(int minCapacity) {
if (minCapacity < 0) // overflow
throw new OutOfMemoryError();
return (minCapacity > MAX_ARRAY_SIZE) ?
Integer.MAX_VALUE :
MAX_ARRAY_SIZE;
}
ArrayList扩容机制。
最新推荐文章于 2024-07-29 17:55:29 发布