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

Java兩套型別系統統一:從手動裝箱拆箱到自動化的演進

     編輯:J2SE

Java 同時擁有基本型別與引用型別兩套系統,造成集合無法直接存放基本型別、API 重複等問題。J2SE 5.0 透過自動裝箱/拆箱在編譯器層面橋接兩套系統。

歷史痛點

// JDK 1.4 風格
List list = new ArrayList();
for (int i=0; i<10; i++) list.add(new Integer(i)); // 手動裝箱
for (Iterator it = list.iterator(); it.hasNext(); ) {
    Integer obj = (Integer) it.next();
    System.out.println(obj.intValue() + 1); // 手動拆箱
}

J2SE 5.0 簡化後

List list = new ArrayList<>();
for (int i=0; i<10; i++) list.add(i); // 自動裝箱
for (int val : list) System.out.println(val + 1); // 自動拆箱 + for-each

編譯器實現細節

  • 裝箱:`Integer.valueOf(int)`、`Double.valueOf(double)` 等靜態工廠方法
  • 拆箱:`intValue()`、`doubleValue()` 等實例方法
  • 發生位置:賦值、方法參數傳遞、返回值、比較運算、算術運算

術語由來

"Boxing/Unboxing" 命名源自 C#,Java 5 正式採用。早期無統一術語,僅稱「包裝/解包裝」。

局限性

  • 不改變 JVM 執行模型,基本型別仍非物件
  • 泛型擦除後仍為 `Object`,基本型別集合仍需裝箱
  • Valhalla 專案(Value Types / Primitive Classes)嘗試從 VM 層面徹底解決
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved