首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Java 陣列初始化:靜態初始化器 vs new 運算符的記憶體與語義差異

     編輯:程式設計綜合問答

兩種寫法

int[] a1 = new int[]{1,2,3}; // 運算式,執行期求值
int[] a2 = {1,2,3};          // 靜態初始化器,僅限宣告處

編譯期 vs 執行期

關鍵結論

  1. **陣列物件永遠在堆上**,無論哪種寫法 (基本類型陣列、物件陣列同理)。
  2. {...} 是語法糖,編譯器展開為與 new int[]{...} 幾乎相同的位元組碼。
  3. **無「棧上分配陣列」機制** (逃逸分析可能標量替換標量,但非語言保證)。

進階:編譯期常數折疊

final int[] CONST = {1,2,3}; // 編譯器可能內聯常數值
// 但 CONST 仍是堆上物件引用,不可變性靠 final 保證引用不變

最佳實踐

  • 宣告即初始化用 {...} 簡潔。
  • 需傳遞匿名陣列、條件構造用 new int[]{...}。
  • 效能敏感熱點路徑,考慮 ArrayList / 基本類型集合庫 (Eclipse Collections, FastUtil) 避免裝箱。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
特性new int[]{...}{...}
語法位置任意運算式位置僅變數宣告初始化
匿名陣列支援 new int[]{1,2}[0]不支援
編譯器處理生成 newarray + bipush... 指令同樣生成指令,**無本質差異**
JVM 記憶體堆上分配陣列物件堆上分配陣列物件