首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

Java 容器類核心體系:Collection、List、Set、Map 與泛型迭代實戰

     編輯:Java 綜合教學

Java 容器類核心體系:Collection、List、Set、Map 與泛型迭代實戰

容器類架構總覽

Java 容器框架由頂層接口約束實現類,核心分為兩大派系:

  • Collection 派系:存儲單一元素序列
    • List:有序、可重複,擁有索引位置(ArrayList、LinkedList)
    • Set:無序、不可重複,對應數學集合概念(HashSet、TreeSet)
    • SortedSet:自動升序排列的 Set
  • Map 派系:存儲 Key-Value 映射對
    • Map:Key 唯一,Value 可重複(HashMap、TreeMap)
    • SortedMap:按 Key 升序排列

Collection 核心 API

統一訪問方式,主要方法:

  • size()、isEmpty()、contains(Object)、containsAll(Collection)
  • add(E)/addAll(Collection)、remove(Object)/removeAll(Collection)/retainAll(Collection)
  • toArray()、clear()、iterator()

集合 vs 數組:集合容量動態增長、僅存對象引用(基本類型需包裝);數組固定長度、可存基本類型與對象。

Iterator 迭代器模式

所有 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(); // 唯一安全的遍歷中刪除方式
}

List 專有操作

基於索引的精確控制:

  • 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)

Collections 工具類:常用算法

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 vs Comparator:排序策略

接口定義位置方法適用場景
Comparable<T>類內部compareTo(T o)自然順序(如 String、Integer、自定義實體)
Comparator<T>類外部/匿名類/Lambdacompare(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));

Map 核心操作

  • 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,但編譯器插入檢查碼保證安全。
通配符:(上界,只讀)、(下界,只寫),PECS 原則:Producer Extends, Consumer Super。

增強 for 循環與 JDK 8+ 流式 API

// 增強 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()

業務思想總結

  1. 接口編程:變量聲明用接口(List、Map、Set),實例化具體實現,便於替換
  2. 選對容器:根據「有序/無序、可重複/唯一、索引/鍵值、併發/單線程」四維決策
  3. 泛型全開:盡可能聲明完整泛型類型,編譯期攔截錯誤
  4. 迭代器刪除:遍歷中修改集合必須用 Iterator.remove() 或 Stream 過濾
  5. 工具類善用:Collections、Arrays、Stream 替代手寫循環
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved