實現 List 接口、基於動態數組、支持隨機訪問。底層封裝 Object[] elementData,默認初始容量 10(JDK 8+ 延遲初始化至首次 add)。
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 ArrayList(Collection extends E> c) {
elementData = c.toArray();
if ((size = elementData.length) != 0) {
if (elementData.getClass() != Object[].class) elementData = Arrays.copyOf(elementData, size, Object[].class);
} else elementData = EMPTY_ELEMENTDATA;
}
public boolean add(E e) {
ensureCapacityInternal(size + 1);
elementData[size++] = e;
return true;
}
private void ensureCapacityInternal(int minCapacity) {
ensureExplicitCapacity(calculateCapacity(elementData, minCapacity));
}
private void ensureExplicitCapacity(int minCapacity) {
modCount++;
if (minCapacity - elementData.length > 0) grow(minCapacity);
}
private void grow(int minCapacity) {
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);
}
Arrays.copyOf 為 O(n) 操作。new ArrayList<>(預估大小) 避免多次擴容複製,大幅提升批量插入性能。trimToSize() 將容量縮減至 size,釋放未用內存,適用於元素固定不再增刪的場景。
| 操作 | 複雜度 | 說明 |
|---|---|---|
| get(index) / set(index, e) | O(1) | 數組隨機訪問優勢 |
| add(e) 尾部 | 均攤 O(1) | 偶爾觸發擴容 O(n) |
| add(index, e) / remove(index) | O(n) | 需移動後續元素,索引越前開銷越大 |
| contains / indexOf / remove(Object) | O(n) | 線性掃描,無索引優化 |
Object。toArray() 返回 Object[];toArray(T[] a) 可獲取具體類型數組(傳入 new T[size] 或 new T[0])。List 可存任意類型,但取出需強轉,不推薦。Serializable,elementData 标记 transient,writeObject/readObject 手動序列化實際大小。modCount 記錄結構性修改次數,迭代器快速失效依賴此字段檢測並發修改。new ArrayList<>(n) 避免擴容抖動。get(i) 遍歷 LinkedList。addAll/removeAll/retainAll,減少擴容與移動次數。LinkedList 或雙端隊列 ArrayDeque。HashSet 或 HashMap。CopyOnWriteArrayList(讀多寫少)或 Collections.synchronizedList(強一致)。trimToSize() 釋放內存。package code;
import java.util.ArrayList;
import java.util.Iterator;
public class SimpleTest {
public static void main(String[] args) {
ArrayList list1 = new ArrayList<>();
list1.add("one"); list1.add("two"); list1.add("three");
list1.add(0, "zero"); // 指插入
System.out.println("size: " + list1.size() + ", content: " + list1);
ArrayList list2 = new ArrayList<>();
list2.add("Begin");
list2.addAll(list1);
list2.add("End");
System.out.println("list2: " + list2);
ArrayList list3 = new ArrayList<>();
list3.add("same"); list3.add("same");
System.out.println("first index: " + list3.indexOf("same"));
System.out.println("last index: " + list3.lastIndexOf("same"));
// Iterator 遍歷
Iterator it = list3.iterator();
while (it.hasNext()) System.out.println(it.next());
// 修改元素
list3.set(0, "another");
list3.set(1, "another");
// 轉數組
Object[] arr = list3.toArray();
for (int i = 0; i < arr.length; i++) System.out.println("arr[" + i + "] = " + arr[i]);
list3.clear();
System.out.println("isEmpty: " + list3.isEmpty());
}
}