java.util.List 接口提供了有序、可重複的集合操作。其中 add 用於插入元素,set 用於替換指定位置元素。本文通過源碼級分析,闡述兩種方法的重載形式、底層實現邏輯及性能特徵。
boolean add(E e)將元素插入列表末尾。若列表結構發生變化(如擴容),返回 true;固定長度列表可能返回 false。
List<String> list = new ArrayList<>();
list.add("保護環境");
list.add("愛護地球");
list.add("從我做起");
// 遍歷輸出
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i));
}
void add(int index, E element)在 index 處插入元素,原位置及後續元素索引 +1。索引從 0 開始,超出範圍拋出 IndexOutOfBoundsException。
ArrayList 底層邏輯:
1. 檢查容量,不足則擴容(1.5 倍)
2. System.arraycopy 將 index 及之後元素向後移動一位
3. 在 index 處寫入新元素
4. size++
void set(int index, E element)
將 index 處元素替換為 element,返回被替換的舊元素。不改變列表長度,時間複雜度 O(1)。同樣需檢查索引合法性。
| 操作 | ArrayList | LinkedList |
|---|---|---|
| 尾部 add | O(1) 攤銷 | O(1) |
| 中間 add | O(n) 需移動數組 | O(n) 需遍歷定位 |
| set | O(1) | O(n) 需遍歷定位 |
頻繁中間插入刪除場景推薦 LinkedList;隨機訪問、尾部追加為主則選 ArrayList。
