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

Java 基本類型與包裝類型深度解析:int 與 Integer 的本質差異

     編輯:Java 相關知識

前言

int 與 Integer 是 Java 開發中最高頻的基本類型與包裝類型組合。看似簡單,實則蘊含記憶體模型、自動拆裝箱、快取機制、泛型擦除等核心知識點。本文將從底層實現、語義差異、效能陷阱、最佳實踐四個維度徹底講透。

一、核心定義對比

特性int (基本類型)Integer (包裝類型)
分類Primitive Type (原始類型)Reference Type (引用類型)
預設值0null
記憶體儲存堆疊區直接儲存數值堆區儲存物件,堆疊存引用
方法支援無(非物件)豐富(parseInt、toString、compareTo 等)
泛型支援不支援支援(List<Integer>)
序列化需包裝實現 Serializable

二、語義差異的實戰影響

2.1 區分「未賦值」與「值為 0」


// Web 表單場景
class ExamForm {
    // int score = 0;  // 無法區分「缺考」與「考了 0 分」
    Integer score;    // null = 缺考,0 = 考了 0 分
}

JSP/EL 表達式中:${form.score} → int 顯示 0,Integer 顯示空白,體驗更佳。

2.2 Hibernate OID 判斷臨時對象


// 推薦:Integer OID
@Entity class User {
    @Id @GeneratedValue
    private Integer id; // null = 臨時對象,自動判斷
}

// 不推薦:int OID 需額外配置
@Entity class User {
    @Id @GeneratedValue
    private int id; // 需在 hbm.xml 配置 unsaved-value="0"
}

三、自動拆裝箱與效能陷阱

3.1 編譯器語法糖


Integer a = 100;        // 自動裝箱 → Integer.valueOf(100)
int b = a;              // 自動拆箱 → a.intValue()
a++;                    // 拆箱 → 運算 → 裝箱

3.2 IntegerCache 快取機制


// JDK 內部實現
public static Integer valueOf(int i) {
    if (i >= IntegerCache.low && i <= IntegerCache.high)
        return IntegerCache.cache[i + (-IntegerCache.low)];
    return new Integer(i);
}
// 預設快取範圍:-128 ~ 127(可透過 -XX:AutoBoxCacheMax=size 調整)

3.3 經典面試陷阱


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

3.4 循環中頻繁拆裝箱效能殺手


// 反例:長循環產生海量 Integer 物件
Long sum = 0L; // 錯誤用 Long 包裝類
for (long i = 0; i < 1_000_000; i++) {
    sum += i; // 每次拆箱+加法+裝箱,產生 100 萬 Long 物件
}

// 正例:使用基本類型累加
long sum = 0L;
for (long i = 0; i < 1_000_000; i++) {
    sum += i; // 零物件分配
}

四、八大基本類型與包裝類型對照表

基本類型包裝類型快取範圍
booleanBooleanTRUE/FALSE 兩個單例
byteByte-128 ~ 127 全快取
charCharacter0 ~ 127
shortShort-128 ~ 127
intInteger-128 ~ 127
longLong-128 ~ 127
floatFloat無快取
doubleDouble無快取

五、最佳實踐總結

  1. 領域模型/DTO/VO:優先用包裝類型,語義清晰、支援 null、適配 JSON/ORM
  2. 高效能計算/迴路累加:堅決用基本類型,避免物件分配與 GC 壓力
  3. 集合/泛型:必須用包裝類型(List<Integer>)
  4. 比較包裝類型:永遠用 .equals(),除非確定在快取範圍內
  5. 資料庫映射:可為 null 的欄位用包裝類型,NOT NULL 欄位可用基本類型

理解 int 與 Integer 的本質差異,是寫出高效、正確、可維護 Java 代碼的基礎功力。

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