現象:基本類型 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 比較)指令判斷。
==、!=、<、> 等運算符作用於包裝類與基本類型混合時,觸發拆箱。+、-、*、/ 算術運算同理。cond ? wrapper : primitive 會拆箱統一類型。Integer a = null;
int b = a; // 拋 NPE,非賦值時拋出,而是拆箱調用 a.intValue() 時拋出
int、long,減少拆裝箱開銷。Objects.equals(a, b) 或 a.equals(b),避免 == 語義歧義(-128~128 緩存範圍內 == 也為 true,超出則 false)。記住:Integer是對象,int是標量。==比較引用,但混合類型時編譯器幫你拆箱變比較值。