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

Java 陣列與集合互轉實戰:Arrays、List、Stream 三重奏

     編輯:Java 相關知識

核心差異速覽

特性陣列集合
元素類型基本型別 + 參考型別僅參考型別 (自動裝箱/拆箱)
長度固定動態擴縮
API 豐富度低 (需自行實作/Arrays 工具)高 (CRUD、排序、篩選、流式處理)
泛型支援無 (共變風險)完整泛型

一、陣列基礎操作:java.util.Arrays

1. 排序

int[] scores = {37, 47, 23, -5, 19, 56};
Arrays.sort(scores); // 原地排序,升序
// 輸出:-5, 19, 23, 37, 47, 56

2. 二分搜尋 (前提:已排序)

int[] sorted = {-5, 19, 23, 37, 47, 56};
int idx = Arrays.binarySearch(sorted, 35); // 回傳 -4 (負數 = 未找到)
int insertPos = -(idx + 1); // = 3,即應插入索引 3

回傳值規則:-(插入點) - 1。插入點 = 為維持有序應插入的索引。

3. 其他常用方法

  • Arrays.toString(arr) / deepToString:除錯輸出
  • Arrays.copyOf(arr, newLen)、copyOfRange:擴縮陣列
  • Arrays.equals(a1, a2)、deepEquals:內容比較
  • Arrays.fill(arr, val):填充
  • Arrays.stream(arr):轉 Stream 進行函數式處理

二、基本型別陣列 → 物件陣列/集合

傳統反射寫法 (舊版相容)

public static Object[] toObjectArray(int[] primitive) {
    if (primitive == null) return null;
    Integer[] boxed = new Integer[primitive.length];
    for (int i = 0; i < primitive.length; i++) {
        boxed[i] = primitive[i]; // 自動裝箱
    }
    return boxed;
}

現代 Stream 一行寫法 (Java 8+)

int[] primitive = {1, 2, 3};
Integer[] boxed = Arrays.stream(primitive).boxed().toArray(Integer[]::new);
List list = Arrays.stream(primitive).boxed().collect(Collectors.toList());

三、物件陣列 ⇄ List 雙向轉換

陣列 → List


String[] arr = {"A", "B", "C"};
// 1. Arrays.asList (固定長度,底層共用陣列)
List fixedList = Arrays.asList(arr);
// 2. 新建可變 List
List mutableList = new ArrayList<>(Arrays.asList(arr));
// 3. Stream (靈活篩選/轉換)
List filtered = Arrays.stream(arr).filter(s -> s.compareTo("B") > 0).collect(Collectors.toList());

陷阱:Arrays.asList 回傳固定長度清單,呼叫 add/remove 會丟 UnsupportedOperationException。

List → 陣列


List list = List.of("A", "B", "C");
// 1. toArray(new String[0]) (JVM 最佳化,推薦)
String[] arr1 = list.toArray(new String[0]);
// 2. toArray(String[]::new) (Java 11+)
String[] arr2 = list.toArray(String[]::new);

四、陣列視圖:Arrays.asList 背後的機制


Object[] data = {Integer.valueOf(37), Integer.valueOf(47)};
List view = Arrays.asList(data); // 非複製,直接包裝
view.set(1, Integer.valueOf(57));        // 修改視圖 = 修改原陣列
System.out.println(data[1]); // 57

適用場景:唯讀遍歷、零拷貝橋接舊 API。需修改長度時請 new ArrayList<>(view)。

五、效能與記憶體考量

操作時間複雜度記憶體建議
基本型別陣列排序O(n log n)原地首選
基本型別 → 物件陣列O(n)新增 O(n) 物件必要時才轉,避免頻繁裝箱
List ⇄ 陣列轉換O(n)新陣列/清單邊界層轉換,核心邏輯統一用 List/Stream
Arrays.asList 視圖O(1)無額外高頻唯讀存取首選

六、最佳實踐清單

  1. 核心領域模型 統一使用 List<T> / Set<T> / Stream<T>,享受泛型與豐富 API。
  2. 序列化/外部介面/高效能熱路徑 才考慮基本型別陣列或 byte[]。
  3. 轉換集中在 Adapter/Mapper 層,避免業務邏輯散落 boxed()/toArray()。
  4. 善用 Arrays.stream、Collection.stream 進行無副作用資料流處理。
  5. 單元測試覆蓋邊界:空陣列、單元素、大資料量、null 輸入。

結語

陣列是 JVM 底層高效資料結構,集合是開發者友善的抽象。掌握 Arrays、Collections、Stream 三大工具箱的轉換慣用語,才能在效能與生產力之間遊刃有餘。

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