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);
}
?
?
?