public class ArrayList<E> extends AbstractList<E>
implements List<E>, RandomAccess, Cloneable, java.io.Serializable
{
//创建final修饰的Object数组
private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};
transient Object[] elementData; // 初始化Object数组作为ArrayList底层实现
private int size;//初始化该数组的长度
private static final int DEFAULT_CAPACITY = 10;
//有参构造器
public ArrayList(int initialCapacity) {
if (initialCapacity > 0) {
this.elementData = new Object[initialCapacity];
} else if (initialCapacity == 0) {
this.elementData = EMPTY_ELEMENTDATA;
} else {
throw new IllegalArgumentException("Illegal Capacity: "+
initialCapacity);
}
}
//空参构造器
public ArrayList() {
this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;//将上面创建的final修饰的Object数组赋给当前数组。
}
//add方法的实现逻辑
public boolean add(E e) {
ensureCapacityInternal(size + 1); //这个是扩容的方法
elementData[size++] = e;//将当前值赋给数组中的下一个元素
return true;
}
//扩容的方法
private void ensureCapacityInternal(int minCapacity) {
ensureExplicitCapacity(calculateCapacity(elementData, minCapacity));
}
//计算容量
private static int calculateCapacity(Object[] elementData, int minCapacity) {
//如果当前数组为空数组的话,则返回DEFAULT_CAPACITY(10)和minCapacity中的最大值。
if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
return Math.max(DEFAULT_CAPACITY, minCapacity);
}
return minCapacity;
}
private void ensureExplicitCapacity(int minCapacity) {
modCount++;
if (minCapacity - elementData.length > 0)
grow(minCapacity);
}
private void grow(int minCapacity) {
// overflow-conscious code
int oldCapacity = elementData.length;//获取当前数组长度
int newCapacity = oldCapacity + (oldCapacity >> 1);//新数组为当前数组的1.5倍
if (newCapacity - minCapacity < 0)
//新数组如果小于当前数组的长度时,则将当前数组长度赋给新数组
newCapacity = minCapacity;
if (newCapacity - MAX_ARRAY_SIZE > 0)
newCapacity = hugeCapacity(minCapacity);
//将老数组里的内容复制到新数组里面,老数组的指向变为新数组
elementData = Arrays.copyOf(elementData, newCapacity);
}
//这个方法是获取数组长度的最大值,最大值不能超过Integer.MAX_VALUE=0x7fffffff;
//MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;
private static int hugeCapacity(int minCapacity) {
if (minCapacity < 0) // overflow
throw new OutOfMemoryError();
return (minCapacity > MAX_ARRAY_SIZE) ?
Integer.MAX_VALUE :
MAX_ARRAY_SIZE;
}
}
Java笔记--ArrayList 源码笔记
于 2022-12-06 18:28:15 首次发布