直接上源码,JDK1.8中的ArrayList;
//往ArrayList中新增一个元素var1
public boolean add(E var1) {
this.ensureCapacityInternal(this.size + 1);
this.elementData[this.size++] = var1;
return true;
}
//新增元素前确保集合容量足够检查
private void ensureCapacityInternal(int var1) {
//为空时初始化默认为10
if(this.elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
var1 = Math.max(10, var1);
}
this.ensureExplicitCapacity(var1);
}
//如果当前的所需的容量大于当前容量,调用grow方法
private void ensureExplicitCapacity(int var1) {
++this.modCount;
if(var1 - this.elementData.length > 0) {
this.grow(var1);
}
//新的集合容量 = 当前容量 + (当前容量 >> 1);新的集合将复制获取到旧集合的顺序数据,然后旧集合将被回收
private void grow(int var1) {
int var2 = this.elementData.length;
int var3 = var2 + (var2 >> 1);
if(var3 - var1 < 0) {
var3 = var1;
}
if(var3 - 2147483639 > 0) {
var3 = hugeCapacity(var1);
}
this.elementData = Arrays.copyOf(this.elementData, var3);
}
}
(1)ArrayList先检查 当前size+1,当前数组是否可以支持。
(2)如果不支持,new新数组,新数组size = 当前容量 + (当前容量 >> 1)
(3)newArray = Arrays.copyOf(this.elementData, newElement);将旧数组与最新的元素数据置值到新数组中。旧数组完成回收
更多互联网与金融技术精华:http://www.moxianbin.com/