兩種寫法
int[] a1 = new int[]{1,2,3}; // 運算式,執行期求值
int[] a2 = {1,2,3}; // 靜態初始化器,僅限宣告處
編譯期 vs 執行期
| 特性 | new int[]{...} | {...} |
| 語法位置 | 任意運算式位置 | 僅變數宣告初始化 |
| 匿名陣列 | 支援 new int[]{1,2}[0] | 不支援 |
| 編譯器處理 | 生成 newarray + bipush... 指令 | 同樣生成指令,**無本質差異** |
| JVM 記憶體 | 堆上分配陣列物件 | 堆上分配陣列物件 |
關鍵結論
- **陣列物件永遠在堆上**,無論哪種寫法 (基本類型陣列、物件陣列同理)。
{...} 是語法糖,編譯器展開為與 new int[]{...} 幾乎相同的位元組碼。
- **無「棧上分配陣列」機制** (逃逸分析可能標量替換標量,但非語言保證)。
進階:編譯期常數折疊
final int[] CONST = {1,2,3}; // 編譯器可能內聯常數值
// 但 CONST 仍是堆上物件引用,不可變性靠 final 保證引用不變
最佳實踐
- 宣告即初始化用
{...} 簡潔。
- 需傳遞匿名陣列、條件構造用
new int[]{...}。
- 效能敏感熱點路徑,考慮
ArrayList / 基本類型集合庫 (Eclipse Collections, FastUtil) 避免裝箱。
- 上一篇文章: Android 多圖上傳服務端覆蓋問題:檔案命名衝突與解決方案
- 下一篇文章: MyEclipse Struts2 標籤誤報錯誤:關閉驗證器即可
Copyright ©
程式碼之家 All Rights Reserved