ArrayList的扩容机制了解吗?
ArrayList是基于数组的集合,数组的容量是在定义的时候确定的,如果数组满了,再插入就会数组溢出。所以在插入时候,会先检查是否需要扩容,如果当前容量+1超过数组长度,就会进行扩容。
ArrayList的扩容是创建一个1.5倍的新数组,然后把原数组的值拷贝过去。
public boolean add(E var1) {
// 确保内部数组容量足够来容纳新元素
this.ensureCapacityInternal(this.size + 1);
// 将新元素添加到数组,并更新size
this.elementData[this.size++] = var1;
// 返回true表示添加成功
return true;
}
private void ensureCapacityInternal(int var1) {
// 如果内部数组是默认空数组,将容量设置为10或var1中的较大值
if (this.elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
var1 = Math.max(10, var1);
}
// 确保容量足够来容纳var1个元素
this.ensureExplicitCapacity(var1);
}
private void ensureExplicitCapacity(int var1) {
// 增加修改次数计数,用于在迭代时检测并发修改
++this.modCount;
// 如果需要的容量大于当前数组长度,执行扩容操作
if (var1 - this.elementData.length > 0) {
this.grow(var1);
}
}
private void grow(int var1) {
// 获取当前数组长度
int var2 = this.elementData.length;
// 计算新的容量,通常为旧容量的1.5倍
int var3 = var2 + (var2 >> 1);
// 如果新容量仍然不足以容纳var1个元素,则将容量设置为var1
if (var3 - var1 < 0) {
var3 = var1;
}
// 如果新容量超出了ArrayList的最大容量限制,调用hugeCapacity方法来确定新容量
if (var3 - 2147483639 > 0) {
var3 = hugeCapacity(var1);
}
// 使用Arrays.copyOf方法将数组扩容为新容量
this.elementData = Arrays.copyOf(this.elementData, var3);
}