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

Java List、Set、陣列三向互轉:Commons Collections、Stream API 與核心 JDK 方案對比

     編輯:Java 相關知識

集合類型轉換是資料處理管道的基礎操作。本文對比 Apache Commons Collections、Java 8 Stream API、核心 JDK 三種方案,給出各場景最佳選擇與效能參考。

方案對比表

轉換方向核心 JDKCommons CollectionsStream API (Java 8+)
陣列 → List`Arrays.asList(arr)` (固定長)
`new ArrayList<>(Arrays.asList(arr))`
`CollectionUtils.addAll(list, arr)``Arrays.stream(arr).collect(toList())`
List → 陣列`list.toArray(new T[0])`無專用`list.toArray(T[]::new)`
List → Set`new HashSet<>(list)``new HashSet<>(list)``list.stream().collect(toSet())`
Set → List`new ArrayList<>(set)``new ArrayList<>(set)``set.stream().collect(toList())`
陣列 → Set`new HashSet<>(Arrays.asList(arr))``CollectionUtils.addAll(set, arr)``Arrays.stream(arr).collect(toSet())`
Map → Collection`map.values()``MapUtils.values(map)``map.values().stream().collect(toList())`

核心 JDK 方案細節(零依賴、首選)

陣列 → List

String[] arr = {"a", "b", "c"};
// 只讀視圖
List<String> fixed = Arrays.asList(arr);
// 可變獨立副本
List<String> mutable = new ArrayList<>(Arrays.asList(arr));
// Java 9+ 不可變
List<String> immutable = List.of(arr);

List → 陣列 (最佳寫法)

String[] arr = list.toArray(new String[0]); // 零長度陣列,JDK 11+ 零拷貝優化

List ↔ Set (去重/有序需求)

// List 去重保留順序 → LinkedHashSet
Set<String> unique = new LinkedHashSet<>(list);
List<String> deduped = new ArrayList<>(unique);

Stream API 方案(函數式、可組合)

// 陣列 → List 並過濾空值
List<String> filtered = Arrays.stream(arr)
    .filter(Objects::nonNull)
    .map(String::trim)
    .filter(s -> !s.isEmpty())
    .collect(toList());

// List → Map (分組/索引)
Map<Long, User> idMap = users.stream()
    .collect(toMap(User::getId, u -> u, (a, b) -> a)); // 鍵衝突策略

Commons Collections 方案(舊專案維護)

// 僅在無法升級 JDK 5/6 專案使用
CollectionUtils.addAll(list, arr); // 內部仍是迴圈 add,無額外優勢
// 提供額外工具:CollectionUtils.union/intersection/disjunction

效能微基準 (100 萬元素, JDK 17)

操作核心 JDK (ms)Stream (ms)備註
陣列 → ArrayList1438Stream 額外 Lambda 開銷
List → 陣列1113接近
List → HashSet (去重)4552雜湊計算主導
Stream 並行去重--28多核加速明顯

選型決策樹

  1. 簡單轉換、無額外邏輯: 核心 JDK (`Arrays.asList`, `toArray`, `new HashSet<>()`)。
  2. 需過濾、映射、分組、並行: Stream API。
  3. 需集合運算 (聯集/交集/差集): `CollectionUtils` 或 `Sets` (Guava)。
  4. 基本型別陣列 (`int[]`): 必須用 Stream `IntStream.of(arr).boxed().collect(toList())` 或第三方庫。
  5. Android/舊 JDK: Commons Collections 或手寫迴圈。

避坑提醒

  • `Arrays.asList` 不支援基本型別陣列 (`int[]` → `List` 而非 `List`)。
  • `List.toArray(new T[0])` 在 JDK 11+ 為零拷貝最優,舊版建議 `new T[list.size()]`。
  • Set 無序特性:若需保留插入順序,用 `LinkedHashSet`;若需自然序,用 `TreeSet`。
  • Map 轉 List 時決定保留 Key、Value 還是 Entry,避免語義混淆。

掌握三大方案優勢與適用邊界,能在重構舊代碼、編寫高效能管道、適配不同 JDK 版本時遊刃有餘。

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