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

Java 基礎:int 與 Integer 的區別——自動裝箱、緩存機制與 == 比較陷阱

     編輯:Java 綜合教學

Java 基礎:int 與 Integer 的區別——自動裝箱、緩存機制與 == 比較陷阱

int 是基本類型,Integer 是其包裝類。兩者透過自動裝箱/拆箱互轉,但 == 比較行為截然不同,面試高頻考點。

核心區別速查

特性intInteger
類型基本類型引用類型(類)
預設值0null
儲存位置棧(區域變數)堆(物件)
== 比較值比較引用比較(地址)
方法支援無parseInt, toString, compareTo 等
泛型使用不可可(List<Integer>)

經典面試代碼與結果

Integer a1 = 2, a2 = 2;
Integer b1 = 150, b2 = 150;
Integer c1 = new Integer(2), c2 = new Integer(2);
Integer d1 = new Integer(150), d2 = new Integer(150);

System.out.println("a1==a2? " + (a1==a2)); // true
System.out.println("b1==b2? " + (b1==b2)); // false
System.out.println("c1==c2? " + (c1==c2)); // false
System.out.println("d1==d2? " + (d1==d2)); // false

為何 a1==a2 為 true,b1==b2 為 false?

Integer 緩存機制(IntegerCache):

  • JVM 啟動時預先建立 [-128, 127] 範圍內的 Integer 物件緩存
  • 自動裝箱(Integer i = 2;)實際調用 Integer.valueOf(int)
  • valueOf 邏輯:若值在緩存範圍內,直接返回緩存物件;否則 new Integer(i)
public static Integer valueOf(int i) {
    if (i >= IntegerCache.low && i <= IntegerCache.high)
        return IntegerCache.cache[i + (-IntegerCache.low)];
    return new Integer(i);
}

因此:

  • a1、a2 皆為 2,在緩存範圍內,指向同一物件 → == 為 true
  • b1、b2 為 150,超出緩存範圍,各自 new 出新物件 → == 為 false
  • new Integer(...) 總是在堆上建立新物件,無論數值大小,== 永遠為 false

緩存範圍可配置

啟動參數 -XX:AutoBoxCacheMax=<size> 可調整緩存上限(預設 127),下限固定 -128。如 -XX:AutoBoxCacheMax=20000 可緩存更大範圍,但會增加啟動時間與記憶體佔用。

最佳實踐

  1. 比較 Integer 值請用 .equals():a1.equals(a2) 永遠比較數值
  2. 避免在高併發熱點路徑大量 new Integer(),優先使用 valueOf() 利用緩存
  3. 集合泛型必須用 Integer,基本類型無法作為類型參數
  4. Java 9+ 引入 Integer.valueOf 內部優化,但語義不變

其他包裝類同理

  • Byte、Short、Long:緩存 [-128, 127]
  • Character:緩存 [0, 127] (Unicode BMP 範圍)
  • Boolean:僅兩個實例 TRUE、FALSE
  • Float、Double:無緩存,每次 valueOf 皆新建物件

理解自動裝箱與緩存機制,能避免生產環境中因 == 比較包裝類導致的隱性 Bug。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved