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

Java 自動拆箱原理:為什麼 int i = 1; Integer b = new Integer(1); i == b 為 true?

     編輯:程式設計綜合問答

字節碼視角揭秘:== 比較觸發了隱式 intValue() 調用

現象:基本類型 int 與包裝類 Integer 直接用 == 比較返回 true,新手以為比較地址,實則不然。

反編譯字節碼證據

  11: aload_2             // 載入 Integer 對象引用
  16: invokevirtual #5    // Method java/lang/Integer.intValue:()I  ← 關鍵!
  19: if_icmpne 26        // 整數比較指令

編譯器自動插入 invokevirtual Integer.intValue() 將 Integer 拆箱為 int,隨後用 if_icmpne(int 比較)指令判斷。

自動拆箱規則(JLS 5.1.8)

  • ==、!=、<、> 等運算符作用於包裝類與基本類型混合時,觸發拆箱。
  • +、-、*、/ 算術運算同理。
  • 三元運算符 cond ? wrapper : primitive 會拆箱統一類型。

經典陷阱:NullPointerException

Integer a = null;
int b = a; // 拋 NPE,非賦值時拋出,而是拆箱調用 a.intValue() 時拋出

最佳實踐

  1. 業務代碼優先用基本類型 int、long,減少拆裝箱開銷。
  2. 集合泛型、反射、泛型方法參數不得不時用包裝類。
  3. 比較包裝類對象值請用 Objects.equals(a, b) 或 a.equals(b),避免 == 語義歧義(-128~128 緩存範圍內 == 也為 true,超出則 false)。
記住:Integer 是對象,int 是標量。== 比較引用,但混合類型時編譯器幫你拆箱變比較值。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved