ArrayList有三个构造方法:
1、无参构造
2、利用其它构建
3、指定顺序表初始容量
无参构造的源码分析
public ArrayList() {
this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
}
上面是ArrayList()无参构造的源码。那么elementData 和 DEFAULTCAPACITY_EMPTY_ELEMENTDATA是啥呢?我们接着找。
transient Object[] elementData; // non-private to simplify nested class access
private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};
看到上面两行源码,我们可以得出elementData是一个没有指向数组的索引。DEFAULTCAPACITY_EMPTY_ELEMENTDATA是一个大小为0的数组
在无参构造中的:this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;这行代码表示让elementData 存储大小为0的数组的索引。
public boolean add(E e) {
ensureCapacityInternal(size + 1); // Increments modCount!!
elementData[size++] = e;
return true;
}
ensureCapacityInternal(size + 1);这个方法源码的注释是递增模数!!。其实就和我们在顺序表中判断其是否满了然后扩容这个操作是十分相似 的。我们接下来看一下他的源码:
private void ensureCapacityInternal(int minCapacity) {
ensureExplicitCapacity(calculateCapacity(elementData, minCapacity));
}
如果想要了解ensureCapacityInternal就必须要了解ensureExplicitCapacity和calculateCapacity的源码
查看calculateCapacity源码 (中文注释为我的解释):
private static int calculateCapacity(Object[] elementData, int minCapacity) {
//DEFAULTCAPACITY_EMPTY_ELEMENTDATA是ArrayList进行无参初始化的时候
//给其赋值的一个大小为0的数组。没有发生什么特殊的变化则是可以进入这个判断
if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
//private static final int DEFAULT_CAPACITY = 10;
//上一行是DEFAULT_CAPACITY的源码,
//下面一行代码是DEFAULT_CAPACITY,和minCapacity哪个值最大所比较
return Math.max(DEFAULT_CAPACITY, minCapacity);//返回的是:10和1比较最大的10
}
return minCapacity;
//若是传入的大小大于10的话返回的就是传入的minCapacity数值
}
查看ensureExplicitCapacity(calculateCapacity源码(中文注释为我的解释):
private void ensureExplicitCapacity(int minCapacity) {//minCapacity是10
modCount++;
// overflow-conscious code
if (minCapacity - elementData.length > 0)
//minCapacity的大小为10,elementData.length的大小为0 这个判断语句可以进入
grow(minCapacity);
}
查看grow源码(中文注释为我的解释):
private void grow(int minCapacity) {//minCapacity 为 10
// overflow-conscious code
int oldCapacity = elementData.length;//oldCapacity 大小为 0
//newCapacity 大小oldCapacity的1.5倍为 0
int newCapacity = oldCapacity + (oldCapacity >> 1);
//newCapacity - minCapacity的值为 -10 这个判断能够给进入
if (newCapacity - minCapacity < 0)
newCapacity = minCapacity;//newCapacity 为 10
//这个判断语句进不去,MAX_ARRAY_SIZE是一个很大的值newCapacity - MAX_ARRAY_SIZE < 0
//这个判断的作用在下面详解add源码的时候再解释
if (newCapacity - MAX_ARRAY_SIZE > 0)
newCapacity = hugeCapacity(minCapacity);
// minCapacity is usually close to size, so this is a win:
//newCapacity的值为10,elementData扩容大小为10
elementData = Arrays.copyOf(elementData, newCapacity);
}