Java 數組深度解析
數組是 Java 中最高效、最基礎的容器。本文從內存佈局、語言級支援、類型系統、聲明創建初始化四個維度,揭示數組「為了效率」的設計哲學。
一、核心特徵:效率優先的三大鐵律
- 連續內存:堆中分配一塊連續地址空間,索引即偏移量,O(1) 隨機訪問。
- 固定長度:創建時指定
length,生命周期不可變(需複製擴容)。
- 類型統一:所有元素共享同一
ComponentType,編譯期檢查,運行期無裝箱開銷(基本類型)。
二、Java 數組的特殊對象身份
- 數組類由 JVM 運行時動態生成(如
[I 代表 int[]),直接繼承 java.lang.Object。
- 擁有
length 最終字段(非方法),繼承 Object 所有方法(clone、toString 等)。
- 實現
Cloneable、Serializable 標記介面。
- 字節碼專用指令:
newarray、anewarray、iaload/iastore 等,避免方法調用開銷。
三、元素類型雙軌制
| 類別 | 存儲內容 | 內存佈局 | 典型用途 |
| 基本類型數組 | 值本身 | 連續基本類型值 | 高性能數值計算、圖像像素、协议解析 |
| 引用類型數組 | 引用地址 | 連續指針 → 指向堆對象 | 對象集合、多態數組、泛型擦除後存儲 |
四、聲明、創建、初始化三步走
1. 靜態初始化
int[] scores = {90, 85, 95, 100};
String[] names = new String[]{"Alice", "Bob"};
2. 動態初始化(指定長度,默認值)
int[] arr = new int[10]; // 全 0
Object[] objs = new Object[5]; // 全 null
3. 多維數組(數組的數組)
int[][] matrix = new int[3][4]; // 3 行 4 列
int[][] jagged = new int[3][]; // 鋸齒數組
jagged[0] = new int[2];
jagged[1] = new int[5];
五、常見操作與陷阱
- 遍歷:
for (int i=0; i 最快;增強 for 僅讀場景。
- 複製:
System.arraycopy(原生最快)、Arrays.copyOf、clone()。
- 排序/查找:
Arrays.sort(雙軸快排/歸併)、Arrays.binarySearch(有序前提)。
- 陷阱:引用類型數組
Arrays.fill(arr, new Obj()) 會導致所有元素指向同一對象。
六、數組 vs 集合:選型指南
| 場景 | 推薦 | 理由 |
| 長度固定、高頻隨機訪問、基本類型 | 數組 | 零開銷、緩存友好、無裝箱 |
| 長度動態、頻繁增刪、需豐富 API | ArrayList/LinkedList | 自動擴容、泛型支援、工具方法 |
| 多線程並發讀寫 | CopyOnWriteArrayList | 寫時復制、讀無鎖 |