public class ArrayList<E> {
//默認容量
private static final int DEFAULT_CAPACITY = 10;
//初始化數組
private static final Object[] EMPTY_ELEMENTDATA = {};
//初始化存儲數組
transient Object[] elementData;
//包含的元素個數
private int size;
//無參構造 空集合
public ArrayList() {
this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
}
//有參構造 根據參數初始化大小
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 void trimToSize() {
modCount++;
//如果集合的大小小於它存儲實體數組的長度,就按照集合的大小截取數組非空部分。
//類似於字符串的去空格
if (size < elementData.length) {
elementData = (size == 0)
? EMPTY_ELEMENTDATA
: Arrays.copyOf(elementData, size);
}
}
//增加元素
public boolean add(E e) {
//需要的最小容量爲當前元素個數+1,調用確認內部容量方法。
ensureCapacityInternal(size + 1);
elementData[size++] = e;
return true;
}
//內部確認需要的容量private
private void ensureCapacityInternal(int minCapacity) {
//如果當前數組還沒有元素存在,就用默認大小來初始化數組
if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
minCapacity = Math.max(DEFAULT_CAPACITY, minCapacity);
}
ensureExplicitCapacity(minCapacity);
}
//確認具體容量數值
private void ensureExplicitCapacity(int minCapacity) {
modCount++;
// overflow-conscious code
//內存溢出考量代碼
//如果最小需要的size大於數組當前長度的話,就繼續grow
if (minCapacity - elementData.length > 0)
grow(minCapacity);
}
private void grow(int minCapacity) {
// overflow-conscious code
//數組的舊長度
int oldCapacity = elementData.length;
//新長度爲1.5倍舊長度
int newCapacity = oldCapacity + (oldCapacity >> 1);
if (newCapacity - minCapacity < 0)
newCapacity = minCapacity;
if (newCapacity - MAX_ARRAY_SIZE > 0)
newCapacity = hugeCapacity(minCapacity);
//按照需要創建新數組
elementData = Arrays.copyOf(elementData, newCapacity);
}
//
private static int hugeCapacity(int minCapacity) {
if (minCapacity < 0) // overflow
throw new OutOfMemoryError();
return (minCapacity > MAX_ARRAY_SIZE) ?
Integer.MAX_VALUE ://list最大容量依然是Integer.MAX_VALUE
MAX_ARRAY_SIZE;
}
}
ArrayList源碼學習(1.1)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.