int 是基本類型,Integer 是其包裝類。兩者透過自動裝箱/拆箱互轉,但 == 比較行為截然不同,面試高頻考點。
| 特性 | int | Integer |
|---|---|---|
| 類型 | 基本類型 | 引用類型(類) |
| 預設值 | 0 | null |
| 儲存位置 | 棧(區域變數) | 堆(物件) |
| == 比較 | 值比較 | 引用比較(地址) |
| 方法支援 | 無 | 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
Integer 緩存機制(IntegerCache):
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,在緩存範圍內,指向同一物件 → == 為 trueb1、b2 為 150,超出緩存範圍,各自 new 出新物件 → == 為 falsenew Integer(...) 總是在堆上建立新物件,無論數值大小,== 永遠為 false啟動參數 -XX:AutoBoxCacheMax=<size> 可調整緩存上限(預設 127),下限固定 -128。如 -XX:AutoBoxCacheMax=20000 可緩存更大範圍,但會增加啟動時間與記憶體佔用。
.equals():a1.equals(a2) 永遠比較數值new Integer(),優先使用 valueOf() 利用緩存Integer,基本類型無法作為類型參數Integer.valueOf 內部優化,但語義不變Byte、Short、Long:緩存 [-128, 127]Character:緩存 [0, 127] (Unicode BMP 範圍)Boolean:僅兩個實例 TRUE、FALSEFloat、Double:無緩存,每次 valueOf 皆新建物件理解自動裝箱與緩存機制,能避免生產環境中因 == 比較包裝類導致的隱性 Bug。