Collection,元素有序、可重複、允許 null。void add(int index, E element) // 指定位置插入 boolean addAll(int index, Collection extends E> c) // 批量插入
越界拋 IndexOutOfBoundsException。示例輸出:
[紅樓夢, 平凡的世界, 三國演義, 三國演義, null] [紅樓夢, [西游記, 水浒傳], 平凡的世界, 三國演義, 三國演義, null]
E get(int index) int indexOf(Object o) // 首次出現索引 int lastIndexOf(Object o) // 最後出現索引 ListsubList(int from, int to) // 子列表視圖 [from, to)
E remove(int index) // 移除並返回該元素,後續元素左移
E set(int index, E element) // 替換並返回舊值
| 方式 | 代碼片段 | 特點 |
|---|---|---|
| ListIterator 正向/逆向 | it.hasNext()/it.next() / it.hasPrevious()/it.previous() | 支持雙向、可增刪改;逆向需先正向遍歷至末尾 |
| Iterator | for (Iterator it = list.iterator(); it.hasNext(); ) | 單向只讀,結束後變量釋放較快 |
| for 索引循環 | for (int i=0; i | 隨機訪問快(ArrayList),順序訪問慢(LinkedList) |
void add(E e) // 當前位置插入 void remove() // 移除上次 next/previous 返回的元素 void set(E e) // 替換上次訪問的元素
關鍵規則:調用 remove/set 前必須先調用 next/previous,否則拋 IllegalStateException。
問題:使用 Iterator 遍歷時直接操作集合(如 list.add())拋 ConcurrentModificationException。
兩種解決路徑:
ListIterator.add/remove/set 替代集合方法。for (int i=0; i 索引循環,直接調用 list.add/remove(新元素追加至末尾)。 // 方案1:ListIterator 安全添加
ListIterator it = list.listIterator();
while (it.hasNext()) {
if ("三國演義".equals(it.next())) it.add("西游記");
}
// 方案2:索引循環安全添加
for (int i = 0; i < list.size(); i++) {
if ("水浒傳".equals(list.get(i))) list.add("西游記");
}