| 維度 | 數組 | 集合 |
|---|---|---|
| 大小 | 創建後固定不可變 | 動態擴容 (ArrayList 1.5倍、HashMap 0.75負載因子) |
| 元素類型 | 單一類型 (基本類型/引用類型) | 泛型擦除後實際存 Object,編譯期類型檢查 |
| 基本類型支持 | 直接存儲 (int[] 存 4 字節整數) | 需裝箱 (Integer) → 內存/性能開銷 |
| API 豐富度 | 僅 length、下標訪問 | 豐富: 增刪改查、排序、搜索、流式處理、併發變體 |
| 內存佈局 | 連續內存,緩存友好 | 對象頭 + 引用數組 + 對象實例,間接訪問 |
| 泛型兼容性 | 协变 | 不變 |
// 陷阱 1: 基本類型數組
int[] arr = {1, 2, 3};
List<int[]> list = Arrays.asList(arr); // 結果: List 單元素是整個數組!
System.out.println(list.size()); // 1
// 正確: 裝箱類型數組
Integer[] arrObj = {1, 2, 3};
List<Integer> listObj = Arrays.asList(arrObj); // List size=3
// 陷阱 2: 返回列表不可變
List<String> fixed = Arrays.asList("a", "b");
fixed.add("c"); // UnsupportedOperationException
// 解決: new ArrayList<>(Arrays.asList(...))
List<String> list = new ArrayList<>(Arrays.asList("a", "b", "c"));
// 方式 1: 無參 toArray() 返回 Object[]
Object[] objArr = list.toArray(); // 需強轉,不安全
// 方式 2: 有參 toArray(T[]) 類型安全 (推薦)
String[] strArr = list.toArray(new String[0]); // JDK 11+ 建議 new String[0]
// 或預分配大小 (避免反射創建)
String[] sizedArr = list.toArray(new String[list.size()]);
int[]: ~4 MB (純數據)ArrayList<Integer>: ~20 MB+ (對象頭 12B + 引用 4/8B + Integer 對象 16B)Arrays.copyOfSystem.arraycopy (原生優化),均攤 O(1)開始 ├─ 元素數量固定、高性能、基本類型 → 數組 (int[], double[], byte[]) ├─ 需要頻繁增刪、業務邏輯複雜 → ArrayList / LinkedList ├─ 鍵值查找、去重 → HashMap / HashSet / LinkedHashMap ├─ 併發環境 → ConcurrentHashMap / CopyOnWriteArrayList ├─ 流式處理、函數式操作 → Collection.stream() └─ 舊版 API 交互、JNI、極致性能敏感區 → 數組
return list.toArray(new String[0]) / return new ArrayList<>(internalList)數組是 JVM 基礎構建塊,集合是工程實踐的標準工具。理解裝箱開銷、內存佈局、協變/不變、固定/動態本質差異,在性能敏感熱點路徑選數組,業務邏輯層用集合,邊界處做好類型安全轉換,是資深 Java 工程師的基本功。