Java 容器框架由頂層接口約束實現類,核心分為兩大派系:
List:有序、可重複,擁有索引位置(ArrayList、LinkedList)Set:無序、不可重複,對應數學集合概念(HashSet、TreeSet)SortedSet:自動升序排列的 SetMap:Key 唯一,Value 可重複(HashMap、TreeMap)SortedMap:按 Key 升序排列統一訪問方式,主要方法:
size()、isEmpty()、contains(Object)、containsAll(Collection)add(E)/addAll(Collection)、remove(Object)/removeAll(Collection)/retainAll(Collection)toArray()、clear()、iterator()集合 vs 數組:集合容量動態增長、僅存對象引用(基本類型需包裝);數組固定長度、可存基本類型與對象。
所有 Collection 實現均提供 iterator() 返回 Iterator,支援:
hasNext():是否有下一個next():獲取並移動游標remove():安全刪除當前元素(直接調用集合 remove() 會拋 ConcurrentModificationException)for (Iterator it = list.iterator(); it.hasNext(); ) {
String s = it.next();
if (s.length() <= 3) it.remove(); // 唯一安全的遍歷中刪除方式
}
基於索引的精確控制:
get(int index)、set(int index, E)、add(int index, E)、remove(int index)indexOf(Object)/lastIndexOf(Object)、subList(int from, int to)ListIterator:雙向游標,支援 hasPrevious()、previous()、add(E)、set(E)java.util.Collections 提供靜態方法操作 List:
sort(List)/sort(List, Comparator):自然序/定製序排序reverse(List)、shuffle(List)(隨機打亂)、rotate(List, distance)binarySearch(List, key):前提是已排序max/min(Collection)、frequency(Collection, Object)、fill(List, Object)synchronizedList/Set/Map:舊式線程安全包裝(現推薦 JUC 並發集合)unmodifiableList/Set/Map:不可變視圖,防範誤修改| 接口 | 定義位置 | 方法 | 適用場景 |
|---|---|---|---|
Comparable<T> | 類內部 | compareTo(T o) | 自然順序(如 String、Integer、自定義實體) |
Comparator<T> | 類外部/匿名類/Lambda | compare(T o1, T o2) | 多種排序策略、無法修改源碼類、臨時排序 |
public class Student implements Comparable {
private String name; private int score;
// 構造器、getter...
@Override public int compareTo(Student o) {
int diff = o.score - this.score; // 降序
return diff != 0 ? diff : this.name.compareTo(o.name);
}
}
// 使用
Collections.sort(studentList); // 直接用自然序
// 或臨時策略
list.sort(Comparator.comparing(Student::getScore).reversed()
.thenComparing(Student::getName));
put(K,V)/putAll(Map)、get(K)、remove(K)containsKey(K)/containsValue(V)keySet()、values()、entrySet()(遍歷首選)// 推薦:entrySet 避免二次查找
for (Map.Entry entry : map.entrySet()) {
System.out.println(entry.getKey() + "=" + entry.getValue());
}
// JDK 8+ Lambda
map.forEach((k, v) -> System.out.println(k + "=" + v));
痛點:JDK 1.4 前集合存取皆為 Object,取出需強轉,易出 ClassCastException,可讀性差。
泛型解決:編譯期類型檢查,List 只能存 String,取出直接是 String。
擦除機制:運行期泛型信息擦除,List 運行時只是 List,但編譯器插入檢查碼保證安全。
通配符: extends T>(上界,只讀)、 super T>(下界,只寫),PECS 原則:Producer Extends, Consumer Super。
// 增強 for:簡單遍歷只讀
for (String s : list) { System.out.println(s); }
// 缺陷:無索引、無法安全刪除、無法並行
// Stream API:函數式、鏈式、可並行
list.stream()
.filter(s -> s.length() > 3)
.map(String::toUpperCase)
.sorted()
.forEach(System.out::println);
// 並行只需 .parallelStream()
List、Map、Set),實例化具體實現,便於替換Iterator.remove() 或 Stream 過濾Collections、Arrays、Stream 替代手寫循環