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

Java 集合框架核心精講:從基礎到泛型與流式操作

     編輯:Java 綜合教學

引言:為什麼需要集合框架

數組長度固定、僅支援線性結構,無法滿足動態增長、樹/圖/哈希等複雜數據結構需求。Java 集合框架(java.util)提供統一接口體系:接口、實現、算法三大支柱。

泛型革命(JDK 1.5)

Pre-JDK 1.5 痛點

  • 隱式向上轉型為 Object,取出需顯式向下轉型
  • 編譯期無法檢查類型安全,運行期易拋 ClassCastException

泛型帶來的改變

List<String> list = new ArrayList<>();
list.add("alpha");        // 編譯期檢查類型
String s = list.get(0);   // 無需轉型,類型安全
// list.add(123);         // 編譯報錯

自動裝箱/拆箱

List<Integer> nums = new ArrayList<>();
nums.add(10);        // autobox: int → Integer
int n = nums.get(0); // unbox: Integer → int

增強 for 循環

for (String s : list) { ... }
// 等價於 iterator 遍歷,但隱藏了 Iterator,不可 remove/replace 元素
// 可修改可變對象內部狀態(如 StringBuilder.append)

集合接口體系架構

Iterable<E> → iterator()
Collection<E> → size/clear/isEmpty/add/remove/contains/toArray...
    ├── List<E>       // 可重複、有序、索引訪問
    │     ├── ArrayList, LinkedList, Vector, Stack
    ├── Set<E>        // 唯一、最多一個 null
    │     ├── HashSet, LinkedHashSet
    │     └── SortedSet<E> → TreeSet
    └── Queue<E>      // FIFO
          ├── PriorityQueue, ArrayDeque
          └── Deque<E> (雙端隊列)

Map<K,V> (非 Collection 子接口)
    ├── HashMap, Hashtable, LinkedHashMap
    └── SortedMap<K,V> → TreeMap

List 實現類深度剖析

ArrayList vs Vector

  • ArrayList:非同步、擴容 1.5倍、性能更優
  • Vector:同步(舊 API)、擴容 2倍、elements() 返回 Enumeration 非 fail-fast

LinkedList 雙向鏈表

  • 實現 List + Deque,首尾增刪 O(1)
  • 適合棧/隊列/雙端隊列場景

數組與 List 互轉

// List → 數組
String[] arr1 = list.toArray(new String[0]);
// 數組 → List(視圖,雙向同步修改)
List<String> list = Arrays.asList("a", "b", "c");

排序與查找算法

Comparable 自然序

public interface Comparable<T> {
    int compareTo(T o); // 負/零/正:小於/等於/大於
}
// 包裝類、String 均實現,配合 Collections.sort/Arrays.sort

Comparator 定製序

Comparator<String> ignoreCase = (s1, s2) -> s1.compareToIgnoreCase(s2);
Collections.sort(list, ignoreCase);
// 或方法引用:String::compareToIgnoreCase

二分查找前提:必須有序

Collections.binarySearch(list, key);      // 返回索引或 (-(插入點)-1)
Collections.binarySearch(list, key, cmp); // 帶比較器版本

Stream API 與集合批處理(JDK 8+)

內部迭代 vs 外部迭代

// 外部迭代
for (String s : list) System.out.println(s);
// 內部迭代
list.forEach(s -> System.out.println(s));

Stream 管道操作

List<String> result = list.stream()
    .filter(s -> s.length() > 3)
    .map(String::toUpperCase)
    .distinct()
    .sorted()
    .collect(Collectors.toList());

並行流利用多核

list.parallelStream().forEach(...); // 或 stream().parallel()

常用收集器

  • toList/toSet/toMap
  • groupingBy 分組統計:groupingBy(Person::getSex, counting())
  • summingInt/averagingDouble 聚合

Reduce 終端操作

int sum = list.stream().mapToInt(Integer::intValue).sum();
// 或 reduce(0, (a,b) -> a+b)

Lambda 表達式與方法引用

  • 函數式接口(單一抽象方法):Runnable/Callable/Comparator/Function/Consumer/Predicate
  • Lambda 本質:匿名方法,目標類型推斷
  • 方法引用:ClassName::staticMethod、instance::method、ClassName::new

默認方法與靜態方法(JDK 8 接口增強)

interface MyInterface {
    void abstractMethod();
    default void defaultMethod() { ... } // 可被實現類繼承或覆蓋
    static void staticMethod() { ... }   // 接口級工具方法
}
// 解決接口擴展破壞現有實現類的問題(如 Collection 添加 stream())

總結

集合框架經歷三次重大演進:統一接口(JDK 1.2) → 泛型/自動裝箱/foreach(JDK 1.5) → Stream/Lambda/默認方法(JDK 8)。掌握核心接口契約、實現類特性、泛型類型安全、函數式處理流,是高效 Java 開發的基石。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved