| 類型 | 語法 | 內存行為 | 程序員視角 |
|---|---|---|---|
| 動態初始化 | new int[3] | 分配堆內存 → 默認值(0/null/false) | 指定長度,不指定值 |
| 靜態初始化 | {1,2,3} | 分配堆內存 → 指定值 | 指定值,長度由系統推導 |
int[] scores = new int[3]; // 堆中分配 int[3],每元素默認 0
// 階段 1:默認初始化(系統自動)
// 階段 2:顯式賦值(程序員代碼)
for (int i = 0; i < scores.length; i++) {
scores[i] = i * 2 + 1; // 覆蓋默認值
}
main() 棧幀
└── scores (引用變量) ──────→ 堆內存
└── int[3] 對象
├── [0] = 1
├── [1] = 3
└── [2] = 5
length、類型信息、元素數據int[] arr = new int[3];
arr.length; // 訪問屬性 → 引用變量代替對象訪問
arr[0] = 10; // 訪問元素 → 引用變量代替對象操作
System.out.println(arr); // 打印引用地址(哈希碼)
規則:只要通過引用變量訪問屬性/調用方法/索引訪問,引用變量即代表其指向的對象。
| 特性 | 局部變量 | 數組元素 |
|---|---|---|
| 存儲位置 | 棧(棧幀局部變量表) | 堆(數組對象內部) |
| 生命周期 | 方法執行期間 | 數組對象存活期間 |
| 基本類型 | 直接存值 | 直接存值 |
| 引用類型 | 存引用(指向堆對象) | 存引用(指向堆對象) |
int[][] matrix = new int[2][3];
// 內存結構:
// matrix (引用) → int[2] (堆)
// ├── [0] → int[3] (堆) → [0,0,0]
// └── [1] → int[3] (堆) → [0,0,0]
// 等價於
int[][] matrix = new int[2][];
matrix[0] = new int[3];
matrix[1] = new int[3];
new int[2][]; arr[0]=new int[3]; arr[1]=new int[5];new int[5][][] → 長度 5 的一維數組,元素類型為二維數組引用length 固定int[] 只能存 int,Parent[] 可存 Child(協變,運行期檢查)ArrayList、Vector 或手動 Arrays.copyOfString[] names = {"Alice", "Bob"};
棧 (main幀)
└── names (引用) ─────────────────────┐
▼
堆
├── String[2] 對象 (length=2)
│ ├── [0] ──────────────────────┐
│ └── [1] ──────────────────────┤
│ ▼
├── "Alice" (String對象, 常量池/堆)
└── "Bob" (String對象, 常量池/堆)
arr.length 是屬性,非方法;String.length() 是方法理解數組內存模型,是掌握 Java 內存管理、排查 OOM、優化性能的基石。面試高頻考點:int[] a = new int[3]; a[0] = 1; 涉及棧、堆、引用、默認值、賦值五個知識點,逐層講清方為過關。