demo:
public static void main(String[] args) {
List<Integer> list = new ArrayList<>(); // 初始化
for (int i=0; i<=1000; i++) {
list.add(i); // 添加元素
}
System.out.println(list.get(11)); // 獲取元素
}
new():
//ArrayList的構造方法只做了一件事,就是將elementData初始化為空陣列,只有第一次呼叫了add方法才會賦予elementData大小為10的默認容量,
public ArrayList() {
this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
}
add():
add的時候,
若原size為0,原陣列長度為0,則size變為1,陣列長度擴容為10
若原size為1,原陣列長度為10,則size變為2,陣列長度不變
若原size為10,原陣列長度為10,則size變為11,陣列長度擴容為10+5=15
若原size為11,原陣列長度為15,則size變為12,陣列長度不變
若原size為15,原陣列長度為15,則size變為16,陣列長度擴容為15+7=22
若原size為16,原陣列長度為22,則size變為17,陣列長度不變
······
//add
public boolean add(E e) {
//確保內部容量(根據所需最小容量)
ensureCapacityInternal(size + 1);
//size位置添加元素
elementData[size++] = e;
//回傳true
return true;
}
//確保內部容量(根據所需最小容量)
private void ensureCapacityInternal(int minCapacity) {
//確保許可容量(根據所需最小容量)
ensureExplicitCapacity(calculateCapacity(elementData, minCapacity));
}
//計算所需最小容量(若默認則最小為10)
private static int calculateCapacity(Object[] elementData, int 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) {
//舊容量為原陣列長度
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);
}
get():
//get
public E get(int index) {
//范圍檢查
rangeCheck(index);
//回傳index下標的元素
return elementData(index);
}
//范圍檢查
private void rangeCheck(int index) {
if (index >= size)
throw new IndexOutOfBoundsException(outOfBoundsMsg(index));
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/193482.html
標籤:其他
