1. 本質區別
特性 | int | Integer |
---|---|---|
類型 | 基本數據類型(Primitive) | 包裝類(Wrapper Class) |
存儲位置 | 棧(或作為對象成員在堆中) | 堆(對象實例) |
默認值 | 0 | null(可能導致?NullPointerException ) |
內存占用 | 4 字節 | 約 16 字節(對象頭 + 內部 int 值) |
2. 核心區別解析
(1) 基本類型 vs 包裝類
-
int:Java 的 8 種基本數據類型之一,直接存儲數值,性能高。
-
Integer:對?
int
?的封裝類,屬于對象類型,提供面向對象的方法(如?compareTo()
、toString()
)。
(2) 自動裝箱(Autoboxing)與拆箱(Unboxing)
Java 編譯器在編譯期自動完成基本類型與包裝類的轉換:
// 自動裝箱:int → Integer
Integer a = 100; // 實際調用 Integer.valueOf(100)// 自動拆箱:Integer → int
int b = a; // 實際調用 a.intValue()
(3) 緩存機制(Integer Cache)
-
范圍:-128 ~ 127(可通過?
-XX:AutoBoxCacheMax
?調整上限)。 -
原理:在此范圍內的?
Integer
?對象會被緩存,復用同一對象。Integer x = 127; Integer y = 127; System.out.println(x == y); // true(同一對象)Integer m = 128; Integer n = 128; System.out.println(m == n); // false(新對象)
(4) 比較陷阱?
Integer a = 200;
Integer b = 200;// 錯誤:比較對象地址
System.out.println(a == b); // false
// 正確:比較數值
System.out.println(a.equals(b)); // true
System.out.println(a.intValue() == b); // true
?
3. 使用場景對比
場景 | 推薦類型 | 原因 |
---|---|---|
計算密集型操作 | int | 避免自動裝箱/拆箱開銷,提升性能 |
集合類(如 List) | Integer | 集合只能存儲對象類型(如?List<Integer> ,無法使用?List<int> ) |
數據庫映射 | Integer | 數據庫字段可能為 NULL,需用包裝類表示空值 |
JSON 序列化 | Integer | 兼容 null 值,避免反序列化時因缺失字段導致默認值問題 |
4. 常見問題與陷阱
(1) NullPointerException
Integer count = null;
int total = count; // 自動拆箱拋出 NullPointerException
(2) 性能損耗
// 循環內頻繁裝箱拆箱導致性能下降
long start = System.currentTimeMillis();
Integer sum = 0;
for (int i = 0; i < 1_000_000; i++) {sum += i; // 等價于 sum = Integer.valueOf(sum.intValue() + i)
}
System.out.println("耗時:" + (System.currentTimeMillis() - start) + "ms");
// 輸出:耗時約 15ms(int 版本僅需 1ms)
(3) 等值比較錯誤
Integer a = 1000;
Integer b = 1000;
System.out.println(a == b); // false(超出緩存范圍,地址不同)
5. 總結與最佳實踐
-
優先使用 int:在無需表示?
null
?的高性能場景(如循環、數學運算)。 -
必須使用 Integer:集合存儲、數據庫映射、API 接口設計(兼容空值)。
-
注意事項:
-
比較包裝類時始終使用?
equals()
?或手動拆箱。 -
警惕自動裝箱的性能損耗,避免在循環中頻繁使用。
-
理解緩存機制,避免超出范圍的對象重復創建。
-