Java 集合框架提供了強大且靈活的容器機制,能夠高效解決大數據量存儲與操作的問題。本文將針對開發中最常用的 ArrayList 與 LinkedList 進行深度解析,並輔以實戰代碼示例,幫助開發者根據場景選擇最優方案。
ArrayList 底層基於動態數組實現,提供了極簡的 API:
add(E e):尾部插入元素,攤還時間複雜度 O(1)get(int index):隨機訪問元素,時間複雜度 O(1)size():獲取當前元素數量優勢在於隨機訪問極快,適合「讀多寫少」且頻繁按索引查詢的場景。但因數組特性,在中間插入/刪除元素需移動後續元素,時間複雜度 O(n),性能較差。
package holding;
import java.util.ArrayList;
public class AppleAndOrangesWithGenerics {
public static void main(String[] args) {
ArrayList<Apple> apples = new ArrayList<>();
for (int i = 0; i < 3; i++) {
apples.add(new Apple());
}
// 方式一:索引遍歷
for (int i = 0; i < apples.size(); i++) {
System.out.println(apples.get(i).id());
}
// 方式二:增強 for 循環(推薦)
for (Apple apple : apples) {
System.out.println(apple.id() + "-");
}
}
}
LinkedList 基於雙向鏈表實現,同樣實現 List 接口,但性能特點截然不同:
addFirst、removeLast、offer、poll 等方法,天然支援堆疊、佇列、雙端佇列操作package holding;
import java.util.LinkedList;
public class LinkedListFeatures {
public static void main(String[] args) {
LinkedList<Pet> pets = new LinkedList<>(Pets.arrayList(5));
System.out.println(pets);
// 佇列操作示例
System.out.println("pets.peek(): " + pets.peek()); // 查看隊首不移除
System.out.println("pets.poll(): " + pets.poll()); // 取出並移除隊首
System.out.println("pets.offer(Pets.randomPet()): " + pets.offer(Pets.randomPet())); // 尾部添加
// 堆疊操作示例
pets.addFirst(new Rat());
pets.addLast(new Hamster());
}
}
對 List 進行排序、查詢時,使用 Collections 靜態方法替代數組的 Arrays 方法:
Collections.sort(list):自然順序排序Collections.sort(list, Comparator):自定義比較器排序Collections.binarySearch(list, key):二分查找(前提:列表已排序)Collections.shuffle(list):隨機打亂順序package containers;
import java.util.*;
public class ListSortSearch {
public static void main(String[] args) {
List<String> list = new ArrayList<>(Utilities.list);
list.addAll(Utilities.list);
Collections.shuffle(list, new Random(47));
// 使用 ListIterator 從索引 10 開始移除後續元素
ListIterator<String> it = list.listIterator(10);
while (it.hasNext()) {
it.next();
it.remove();
}
Collections.sort(list);
String key = list.get(7);
int index = Collections.binarySearch(list, key);
System.out.println("Location of " + key + " is " + index);
// 忽略大小寫排序
Collections.sort(list, String.CASE_INSENSITIVE_ORDER);
}
}
| 場景 | 推薦容器 | 理由 |
|---|---|---|
| 頻繁隨機訪問、末尾增刪 | ArrayList | O(1) 訪問,尾部操作攤還 O(1) |
| 頻繁頭部/中間增刪、佇列/堆疊 | LinkedList | O(1) 插入刪除,原生支援 Deque |
| 需排序、查詢、去重 | 配合 Collections / Set | 工具類豐富,避免重複造輪子 |
總結:理解底層數據結構特性,根據業務訪問模式選擇容器,是寫出高性能 Java 代碼的關鍵。