首先,ArrayList的底层实现是通过数组来实现的,主要成员变量包括
private static final int DEFAULT_CAPACITY = 10; //默认初始化容量
private static final Object[] EMPTY_ELEMENTDATA = {};
private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {}; //默认为new ArrayList()返回的空数组
//存放ArrayList的数据,数组的长度为ArrayList的容量,当elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA的ArrayList增加第一个元素时,容量扩大到默认容量
transient Object[] elementData;
private int size; //arraylist的大小(它包含的元素的个数)
我们定义一个ArrayList(没有设置初始容量,new ArrayList()),当往该list中添加一个元素时,首先将容量扩大到10,并且在每次添加元素时检测容量是否够,如果不够就进行扩容,扩容到原来容量的1.5倍。
//增加元素方法
public boolean add(E e) {
ensureCapacityInternal(size + 1); // Increments modCount!!
elementData[size++] = e;
return true;
}
private static int calculateCapacity(Object[] elementData, int minCapacity) {
if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
return Math.max(DEFAULT_CAPACITY, minCapacity);
}
return minCapacity;
}
private void ensureCapacityInternal(int minCapacity) {
ensureExplicitCapacity(calculateCapacity(elementData, minCapacity));
}
//如果容量不够,进行扩容
private void ensureExplicitCapacity(int minCapacity) {
modCount++;
// overflow-conscious code
if (minCapacity - elementData.length > 0)
grow(minCapacity);
}
//扩容核心算法(扩容到原来的1.5倍)
private void grow(int minCapacity) {
// overflow-conscious code
int oldCapacity = elementData.length;
int newCapacity = oldCapacity + (oldCapacity >> 1);
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);
}
//可以看出ArrayList的最大容量
private static int hugeCapacity(int minCapacity) {
if (minCapacity < 0) // overflow
throw new OutOfMemoryError();
return (minCapacity > MAX_ARRAY_SIZE) ?
Integer.MAX_VALUE :
MAX_ARRAY_SIZE;
}