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

Java 基礎核心:int 與 Integer 的本質區別、自動裝箱/拆箱與效能考量

     編輯:Java 相關知識

核心定義對比

特性intInteger
類型分類基本資料型別包裝類別(Wrapper Class)
記憶體儲存堆疊,直接存值堆,存物件引用
預設值0null
運算速度快(直接 CPU 指令)較慢(物件方法呼叫、拆裝箱開銷)
泛型支援不可用可用(List<Integer> 等)
Null 安全性無 null 概念可為 null,需防 NPE

為何需要 Integer?

《Thinking in Java》指出:基本型別有對應的「包裝類別」,當需要在堆上建立代表基本型別的非原始物件時(如集合框架、泛型、反射、序列化),包裝類別派上用場。Java 5+ 引入自動裝箱/拆箱,讓兩者互轉更便捷:

Integer i = 10;      // 自動裝箱:Integer.valueOf(10)
int n = i;           // 自動拆箱:i.intValue()
Integer sum = 10 + 20; // 隱含拆箱運算後再裝箱

關鍵陷阱與最佳實踐

1. 快取機制與 == 比較

Integer.valueOf() 對 -128 到 127 之間的值有快取,直接返回同一物件實例:

Integer a = 100, b = 100;
System.out.println(a == b); // true(快取命中)

Integer c = 200, d = 200;
System.out.println(c == d); // false(新建物件)

// 正確比較值
System.out.println(c.equals(d)); // true

2. 空指針風險


Integer obj = null;
int val = obj; // 運行時拋出 NullPointerException

防禦性編程:int val = obj != null ? obj : 0; 或使用 Optional<Integer>。

3. 效能敏感場景

  • 大量數值運算、迴路計數器:優先用 int。
  • 集合、Map 鍵值、需表達「無值」語義:用 Integer。
  • 高併發計數器:考慮 AtomicInteger 或 LongAdder。

4. 不可變性

Integer 物件不可變,任何修改操作都會產生新實例,頻繁修改會增加 GC 壓力。

總結決策樹

  1. 需要放入集合/Map/泛型? → Integer
  2. 需要表達「無值/缺失」? → Integer
  3. 純數值運算、高效能計算? → int
  4. 方法參數/返回值,無特殊語義需求? → int(避免拆裝箱開銷)

理解兩者本質差異與 JVM 底層機制,能寫出更健壯、高效的 Java 代碼。

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