Java中int與Integer的區(qū)別詳解及常見問題解決
1. 本質(zhì)與存儲(chǔ)方式
| 特性 | int | Integer |
|---|---|---|
| 類型 | 基本數(shù)據(jù)類型(Primitive Type) | 引用類型(包裝類,Object 的子類) |
| 存儲(chǔ)位置 | 棧內(nèi)存(Stack) | 堆內(nèi)存(Heap) |
| 內(nèi)存占用 | 4 字節(jié)(固定) | 對象頭 + 4 字節(jié)值 ≈ 16-24 字節(jié) |
示例:
int a = 10; // 棧中直接存儲(chǔ)值 10 Integer b = Integer.valueOf(10); // 堆中存儲(chǔ)對象,變量 b 存儲(chǔ)對象引用
2. 默認(rèn)值
| 場景 | int | Integer |
|---|---|---|
| 未初始化值 | 0 | null |
| 集合存儲(chǔ) | 無法直接存入集合(需自動(dòng)裝箱為 Integer) | 可直接存入集合(如 List<Integer>) |
示例:
int num1; // 默認(rèn)值為 0 Integer num2; // 默認(rèn)值為 null(可能引發(fā) NullPointerException) List<Integer> list = new ArrayList<>(); list.add(10); // 自動(dòng)裝箱:int → Integer
3. 功能與方法
| 能力 | int | Integer |
|---|---|---|
| 方法支持 | 無方法,僅存儲(chǔ)值 | 提供數(shù)值轉(zhuǎn)換、比較等工具方法(如 parseInt()、compareTo()) |
| 空值處理 | 不能為 null | 可為 null(需注意空指針) |
| 泛型支持 | 無法直接用于泛型 | 支持泛型(如 List<Integer>) |
示例:
int num = Integer.parseInt("123"); // String → int
Integer value = Integer.valueOf("456");// String → Integer
int max = Integer.MAX_VALUE; // 獲取 int 最大值4. 自動(dòng)裝箱與拆箱
自動(dòng)裝箱(Autoboxing):Java 編譯器自動(dòng)將
int轉(zhuǎn)換為Integer。自動(dòng)拆箱(Unboxing):自動(dòng)將
Integer轉(zhuǎn)換為int。
示例:
Integer a = 10; // 自動(dòng)裝箱:等價(jià)于 Integer.valueOf(10) int b = a; // 自動(dòng)拆箱:等價(jià)于 a.intValue()
性能注意: 自動(dòng)裝箱/拆箱會(huì)帶來額外開銷,高頻操作時(shí)建議直接使用 int。
5. 比較操作
| 比較方式 | int | Integer |
|---|---|---|
| == 比較 | 直接比較值是否相等 | 比較對象引用地址(除非值在緩存范圍內(nèi)) |
| equals() | 不適用(基本類型無方法) | 比較值是否相等 |
示例:
int x1 = 1000; int x2 = 1000; System.out.println(x1 == x2); // true(值相等) ? Integer y1 = 1000; Integer y2 = 1000; System.out.println(y1 == y2); // false(對象地址不同) System.out.println(y1.equals(y2)); // true(值相等) ? // 緩存范圍測試(-128~127) Integer z1 = 127; Integer z2 = 127; System.out.println(z1 == z2); // true(復(fù)用緩存對象)
6. 緩存機(jī)制(IntegerCache)
緩存范圍:
Integer類默認(rèn)緩存-128到127之間的值。目的:減少頻繁創(chuàng)建小數(shù)值對象,優(yōu)化內(nèi)存和性能。
擴(kuò)展緩存:可通過 JVM 參數(shù)
-XX:AutoBoxCacheMax=<size>調(diào)整上限。
示例:
Integer a = 127; // 從緩存獲取 Integer b = 127; // 復(fù)用緩存對象 System.out.println(a == b); // true ? Integer c = 128; // 超出緩存范圍,新建對象 Integer d = 128; // 新建另一個(gè)對象 System.out.println(c == d); // false
7. 使用場景
| 場景 | 推薦使用 | 原因 |
|---|---|---|
| 高頻計(jì)算 | int | 避免自動(dòng)裝箱開銷,性能更優(yōu) |
| 集合存儲(chǔ) | Integer | 集合泛型不支持基本類型(如 List<int> 非法) |
| 數(shù)據(jù)庫映射 | Integer | 數(shù)據(jù)庫字段可能為 NULL,int 無法表示 |
| API 設(shè)計(jì) | Integer | 方法參數(shù)或返回值可能需區(qū)分“無值”(null) |
8. 常見問題與陷阱
(1) NullPointerException
Integer value = null; int num = value; // 運(yùn)行時(shí)拋出 NullPointerException(自動(dòng)拆箱調(diào)用 intValue())
(2) 性能損耗
// 高頻循環(huán)中自動(dòng)裝箱導(dǎo)致性能下降
long sum = 0;
for (Integer i = 0; i < 100000; i++) { // 每次循環(huán)觸發(fā)裝箱
sum += i;
}(3) 比較錯(cuò)誤
Integer a = 200;
Integer b = 200;
if (a == b) { // false,應(yīng)使用 equals() 或 intValue() 比較
System.out.println("Equal");
}總結(jié)
| 維度 | int | Integer |
|---|---|---|
| 類型 | 基本數(shù)據(jù)類型 | 包裝類(引用類型) |
| 內(nèi)存 | 棧存儲(chǔ),高效 | 堆存儲(chǔ),有對象開銷 |
| 空值 | 不支持 | 支持(需防空指針) |
| 方法 | 無 | 提供工具方法 |
| 適用場景 | 高頻計(jì)算、性能敏感場景 | 集合、數(shù)據(jù)庫映射、API 設(shè)計(jì) |
選擇建議:
優(yōu)先使用
int:在不需要對象特性(如 null 值、方法操作)時(shí),提升性能。必須使用
Integer:在泛型集合、數(shù)據(jù)庫映射或需要區(qū)分“無值”場景時(shí)。
到此這篇關(guān)于Java中int與Integer的區(qū)別詳解及常見問題解決的文章就介紹到這了,更多相關(guān)Java中int與Integer區(qū)別內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Spring?Cloud?Gateway集成Sentinel流控詳情
這篇文章主要介紹了Spring?Cloud?Gateway集成Sentinel流控詳情,Sentinel支持對Spring?Cloud?Gateway、Zuul等主流的API?Gateway進(jìn)行限流,需要的朋友可以參考一下2022-09-09
SpringBoot 3.x使用starter整合Druid的過程及問題小結(jié)
Druid是一個(gè)由阿里巴巴開源的數(shù)據(jù)庫連接池,性能優(yōu)越且功能豐富,在Spring Boot項(xiàng)目中集成Druid時(shí),需要注意依賴版本和配置文件的正確性,本文給大家介紹SpringBoot 3.x使用starter整合Druid的過程及問題小結(jié),感興趣的朋友跟隨小編一起看看吧2025-11-11
詳解Java的readBytes是怎么實(shí)現(xiàn)的
眾所周知,Java是一門跨平臺(tái)語言,針對不同的操作系統(tǒng)有不同的實(shí)現(xiàn),下面小編就來從一個(gè)非常簡單的api調(diào)用帶大家來看看Java具體是怎么做的吧2023-07-07
JavaBean和SpringBean的區(qū)別及創(chuàng)建SpringBean方式
這篇文章主要介紹了JavaBean和SpringBean的區(qū)別及創(chuàng)建SpringBean方式,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-10-10
Java啟動(dòng)Tomcat的實(shí)現(xiàn)步驟
本文主要介紹了Java啟動(dòng)Tomcat的實(shí)現(xiàn)步驟,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-05-05
java啟動(dòng)jar包設(shè)置啟動(dòng)參數(shù)的實(shí)現(xiàn)
本文主要介紹了java啟動(dòng)jar包設(shè)置啟動(dòng)參數(shù)的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-06-06

