注意:本文内容基于JDK11,不同版本会有差异
ArrayList的结构ArrayList的本质上是个数组,他的底层实现都是对数组的操作。它所操作的数组就是elementData.
源码解析以add方法作为入口,对ArrayList进行解析
public boolean add(E e){
modCount++;
add(e, elementData, size);
return true;
}
private void add(E e, Object[] elementData, int s){
//根据s与数组length大小的比较,如果相等才需要进入到grow方法
//而不是每次添加元素都需要进行扩容
if(s == elementData.length){
elementData = grow();
}
elementData[s] = e;
size = s + 1;
}
private Object[] grow(){
return grow(size + 1);
}
private Object[] grow(int minCapacity){
//重新计算数组容量的大小,并且根据新的大小复制一个数组
elementData = Arrays.copyOf(elementData, newCapacity(minCapacity));
return elementData;
}
private int newCapacity(int minCapacity){
//旧的容量
int oldCapacity = elementData.length;
//新的容量为在旧的基础上扩容50%
int newCapacity = oldCapacity + (oldCapacity >> 1);
if(newCapacity - minCapacity <= 0){
if(elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA){
return Math.max(DEFAULT_CAPACITY, minCapacity);
}
//小于0,是针对于当int的最大值+1为负值的情况
if(minCapacity < 0){
throw new OutOfMemoryError();
}
return minCapacity;
}
return (newCapacity - MAX_ARRAY_SIZE <= 0) ? newCapacity : hugeCapacity(minCapacity);
}
private static int hugeCapacity(int minCapacity){
if(minCapacity < 0){
throw new OutOfMemoryError();
}
return (minCapacity > MAX_ARRAY_SIZE) ? Integer.MAX_VALUE : MAX_ARRAY_SIZE;
}



