List 接口核心方法速查表
| 分類 | 方法 | 說明 | 時間複雜度 |
| 增 | add(E e) | 尾部追加 | O(1) 均攤 |
| add(int index, E e) | 指定位置插入,後續元素右移 | O(n) |
| addAll(Collection<? extends E> c) | 批量追加 | O(m) |
| 刪 | remove(int index) | 按索引刪除,返回被刪元素 | O(n) |
| remove(Object o) | 按內容刪除首個匹配,返回 boolean | O(n) |
| clear() | 清空列表 | O(n) |
| 改 | set(int index, E e) | 替換指定位置元素,返回舊值 | O(1) |
| replaceAll(UnaryOperator<E> op) | 函數式替換所有元素 | O(n) |
| 查 | get(int index) | 按索引獲取 | O(1) |
| indexOf(Object o) | 首次出現索引,無則 -1 | O(n) |
| lastIndexOf(Object o) | 最後出現索引 | O(n) |
| contains(Object o) | 是否包含元素 | O(n) |
| 其他 | size(), isEmpty(), iterator(), toArray(), subList() | 常用輔助方法 | - |
實戰代碼演示(含輸出註解)
List<String> list = new ArrayList<>();
// 1. 添加/獲取/刪除
list.add("Jack"); // [Jack]
list.add("Peter"); // [Jack, Peter]
list.add("Annie"); // [Jack, Peter, Annie]
list.remove(1); // [Jack, Annie] 刪除索引1 Peter
list.remove("Annie"); // [Jack] 刪除內容 Annie
String name = list.get(0); // Jack
// 2. 包含判斷
List<String> fruits = Arrays.asList("蘋果", "香蕉", "桃子");
boolean hasApple = fruits.contains("蘋果"); // true
// 3. 替換 vs 插入區別
List<String> people = new ArrayList<>(Arrays.asList("白龍馬", "沙和尚", "八戒"));
people.set(0, "唐僧"); // [唐僧, 沙和尚, 八戒] 替換索引0
people.add(1, "悟空"); // [唐僧, 悟空, 沙和尚, 八戒] 插入索引1,原元素後移
// 4. 索引查詢
List<String> names = Arrays.asList("劉備", "關羽", "張飛", "劉備", "張飛");
names.indexOf("劉備"); // 0 首次
names.lastIndexOf("劉備"); // 3 最後
// 5. 截取子列表(視圖,非拷貝!)
List<String> phones = new ArrayList<>(Arrays.asList("三星", "蘋果", "錘子", "華為", "小米"));
List<String> sub = phones.subList(1, 4); // [蘋果, 錘子, 華為] 包含1,不含4
// 注意:sub 是視圖,修改 sub 會影響 phones,序列化會失敗
// 6. 列表比較
List<String> a = Arrays.asList("1", "2");
List<String> b = Arrays.asList("1", "2");
a.equals(b); // true 內容順序全等
a.hashCode() == b.hashCode(); // true 但反向不成立
// 7. 空判斷
list.isEmpty(); // false
// 8. 迭代器
Iterator<String> it = list.iterator();
// 9. 轉字符串
list.toString(); // "[Jack]"
// 10. 轉數組
Object[] arr = list.toArray(); // Object[]
String[] strArr = list.toArray(new String[0]); // String[] 推薦寫法
// 11. 類型轉換
List<Object> objList = new ArrayList<>(list); // 向上轉型
List<StringBuilder> sbList = list.stream()
.map(StringBuilder::new).collect(Collectors.toList()); // 指定類型
高頻坑點避雷
- subList 視圖特性:非獨立拷貝,原列表結構修改會導致子列表失效(拋
ConcurrentModificationException)。需獨立拷貝用 new ArrayList<>(subList)
- 遍歷中刪除:for 循環 remove 導致索引錯位,必須用
Iterator.remove() 或逆序循環
- List 去重:
new ArrayList<>(new LinkedHashSet<>(list)) 保持順序;Java 10+ list.stream().distinct().collect(toList())
- Arrays.asList 陷阱:返回固定長度列表,不支持 add/remove,需
new ArrayList<>(Arrays.asList(...))
性能選型指南
| 場景 | 推薦實現 | 理由 |
| 頻繁隨機訪問、少量增刪 | ArrayList | 底層數組,get/set O(1) |
| 頻繁頭尾增刪、併發場景 | LinkedList / ConcurrentLinkedDeque | 鏈表結構,無擴容拷貝 |
| 線程安全、高併發讀寫 | CopyOnWriteArrayList | 寫時復制,讀無鎖 |
| 大數據量、內存敏感 | ArrayList + ensureCapacity | 預分配減少擴容 |
List 是 Java 集合框架使用率最高的接口,吃透其 API 特性與底層實現差異,能讓業務代碼更簡潔、性能更穩健。