int 是 Java 基本資料類型,佔 4 位元組,預設值 0,直接儲存數值;Integer 是其包裝類,繼承自 Number,為物件類型,儲存記憶體堆中物件的引用,預設值 null。兩者透過自動拆箱裝箱機制互相轉換,但比較行為截然不同。

圖示揭示核心規則:
== 比較數值本身== 比較記憶體位址(引用)Java 編譯器對 -128 ~ 127 範圍的整數進行快取優化:
Integer a = 100; // 使用快取物件
Integer b = 100;
a == b // true,同一快取物件
Integer c = 200; // 新建物件
Integer d = 200;
c == d // false,不同記憶體位址
此機制源自 IntegerCache 靜態內部類,可透過 -XX:AutoBoxCacheMax JVM 參數調整上限。
Integer x = 200, y = 200;
x.equals(y) // true,比較數值內容
Objects.equals(a, b) // null 安全
a != null && a.equals(b) // 傳統寫法
高效能場景優先使用 int,僅在集合、泛型、需表達「無值」時使用 Integer。
| 表達式 | 結果 | 原因 |
|---|---|---|
| new Integer(100) == new Integer(100) | false | 新建兩個不同物件 |
| Integer.valueOf(100) == 100 | true | 自動拆箱比較數值 |
| Integer.valueOf(1000) == Integer.valueOf(1000) | false | 超出快取範圍,新建物件 |
掌握拆箱裝箱規則與快取邊界,是寫出正確、高效 Java 代碼的關鍵。