Java中int與Integer的區(qū)別詳解及常見(jiàn)問(wèn)題解決
1. 本質(zhì)與存儲(chǔ)方式
特性 | int | Integer |
---|---|---|
類型 | 基本數(shù)據(jù)類型(Primitive Type) | 引用類型(包裝類,Object 的子類) |
存儲(chǔ)位置 | 棧內(nèi)存(Stack) | 堆內(nèi)存(Heap) |
內(nèi)存占用 | 4 字節(jié)(固定) | 對(duì)象頭 + 4 字節(jié)值 ≈ 16-24 字節(jié) |
示例:
int a = 10; // 棧中直接存儲(chǔ)值 10 Integer b = Integer.valueOf(10); // 堆中存儲(chǔ)對(duì)象,變量 b 存儲(chǔ)對(duì)象引用
2. 默認(rèn)值
場(chǎng)景 | int | Integer |
---|---|---|
未初始化值 | 0 | null |
集合存儲(chǔ) | 無(wú)法直接存入集合(需自動(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 |
---|---|---|
方法支持 | 無(wú)方法,僅存儲(chǔ)值 | 提供數(shù)值轉(zhuǎn)換、比較等工具方法(如 parseInt() 、compareTo() ) |
空值處理 | 不能為 null | 可為 null(需注意空指針) |
泛型支持 | 無(wú)法直接用于泛型 | 支持泛型(如 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ì)帶來(lái)額外開(kāi)銷,高頻操作時(shí)建議直接使用 int
。
5. 比較操作
比較方式 | int | Integer |
---|---|---|
== 比較 | 直接比較值是否相等 | 比較對(duì)象引用地址(除非值在緩存范圍內(nèi)) |
equals() | 不適用(基本類型無(wú)方法) | 比較值是否相等 |
示例:
int x1 = 1000; int x2 = 1000; System.out.println(x1 == x2); // true(值相等) ? Integer y1 = 1000; Integer y2 = 1000; System.out.println(y1 == y2); // false(對(duì)象地址不同) System.out.println(y1.equals(y2)); // true(值相等) ? // 緩存范圍測(cè)試(-128~127) Integer z1 = 127; Integer z2 = 127; System.out.println(z1 == z2); // true(復(fù)用緩存對(duì)象)
6. 緩存機(jī)制(IntegerCache)
緩存范圍:
Integer
類默認(rèn)緩存-128
到127
之間的值。目的:減少頻繁創(chuàng)建小數(shù)值對(duì)象,優(yōu)化內(nèi)存和性能。
擴(kuò)展緩存:可通過(guò) JVM 參數(shù)
-XX:AutoBoxCacheMax=<size>
調(diào)整上限。
示例:
Integer a = 127; // 從緩存獲取 Integer b = 127; // 復(fù)用緩存對(duì)象 System.out.println(a == b); // true ? Integer c = 128; // 超出緩存范圍,新建對(duì)象 Integer d = 128; // 新建另一個(gè)對(duì)象 System.out.println(c == d); // false
7. 使用場(chǎng)景
場(chǎng)景 | 推薦使用 | 原因 |
---|---|---|
高頻計(jì)算 | int | 避免自動(dòng)裝箱開(kāi)銷,性能更優(yōu) |
集合存儲(chǔ) | Integer | 集合泛型不支持基本類型(如 List<int> 非法) |
數(shù)據(jù)庫(kù)映射 | Integer | 數(shù)據(jù)庫(kù)字段可能為 NULL,int 無(wú)法表示 |
API 設(shè)計(jì) | Integer | 方法參數(shù)或返回值可能需區(qū)分“無(wú)值”(null) |
8. 常見(jiàn)問(wèn)題與陷阱
(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ǔ),有對(duì)象開(kāi)銷 |
空值 | 不支持 | 支持(需防空指針) |
方法 | 無(wú) | 提供工具方法 |
適用場(chǎng)景 | 高頻計(jì)算、性能敏感場(chǎng)景 | 集合、數(shù)據(jù)庫(kù)映射、API 設(shè)計(jì) |
選擇建議:
優(yōu)先使用
int
:在不需要對(duì)象特性(如 null 值、方法操作)時(shí),提升性能。必須使用
Integer
:在泛型集合、數(shù)據(jù)庫(kù)映射或需要區(qū)分“無(wú)值”場(chǎng)景時(shí)。
到此這篇關(guān)于Java中int與Integer的區(qū)別詳解及常見(jiàn)問(wèn)題解決的文章就介紹到這了,更多相關(guān)Java中int與Integer區(qū)別內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Java中關(guān)于int和Integer的區(qū)別詳解
- Java int與integer的對(duì)比區(qū)別
- Java中int和Integer的區(qū)別
- 詳解Java中int和Integer的區(qū)別
- Java中int與integer的區(qū)別(基本數(shù)據(jù)類型與引用數(shù)據(jù)類型)
- Java中Integer和int的區(qū)別解讀
- 通過(guò)實(shí)例了解Java Integer類和int的區(qū)別
- Java數(shù)據(jù)類型Integer與int的區(qū)別詳細(xì)解析
- 簡(jiǎn)單了解java中int和Integer的區(qū)別
相關(guān)文章
SpringBoot?整合MyBatis+MyBatis-Plus+MyBatisX插件使用
本文主要介紹了SpringBoot?整合MyBatis+MyBatis-Plus+MyBatisX插件使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2024-04-04教你用Java驗(yàn)證服務(wù)器登錄系統(tǒng)
這篇文章主要介紹了教你用Java驗(yàn)證服務(wù)器登錄系統(tǒng),文中有非常詳細(xì)的代碼示例,對(duì)正在學(xué)習(xí)java的小伙伴們有很好的幫助,需要的朋友可以參考下2021-04-04Java計(jì)時(shí)器StopWatch實(shí)現(xiàn)方法代碼實(shí)例
這篇文章主要介紹了Java計(jì)時(shí)器StopWatch實(shí)現(xiàn)方法代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-07-07SpringBoot基于HttpMessageConverter實(shí)現(xiàn)全局日期格式化
這篇文章主要介紹了SpringBoot基于HttpMessageConverter實(shí)現(xiàn)全局日期格式化,使用Jackson消息轉(zhuǎn)換器,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2018-12-12spring aop之@AfterReturning不生效問(wèn)題及解決
這篇文章主要介紹了spring aop之@AfterReturning不生效問(wèn)題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-05-05Spring Boot實(shí)現(xiàn)模塊化的幾種方法
模塊可以是業(yè)務(wù)模塊,為應(yīng)用程序提供一些業(yè)務(wù)服務(wù),或者為幾個(gè)其他模塊或整個(gè)應(yīng)用程序提供跨領(lǐng)域關(guān)注的技術(shù)模塊。這篇文章主要介紹了Spring Boot實(shí)現(xiàn)模塊化,需要的朋友可以參考下2018-07-07基于Java代碼實(shí)現(xiàn)數(shù)字在數(shù)組中出現(xiàn)次數(shù)超過(guò)一半
這篇文章主要介紹了基于Java代碼實(shí)現(xiàn)數(shù)字在數(shù)組中出現(xiàn)次數(shù)超過(guò)一半的相關(guān)資料,需要的朋友可以參考下2016-02-02SpringBoot+JavaMailSender實(shí)現(xiàn)騰訊企業(yè)郵箱配置
這篇文章主要介紹了SpringBoot+JavaMailSender實(shí)現(xiàn)騰訊企業(yè)郵箱配置,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-04-04關(guān)于mybatis-plus邏輯刪除自動(dòng)填充更新時(shí)間的問(wèn)題
mybatis-plus是對(duì)mybatis的增強(qiáng),mybatis-plus更像是面向?qū)ο缶幊?,?shù)據(jù)庫(kù)基本CRUD的操作可以不用手動(dòng)編寫SQL語(yǔ)句,大大提高了開(kāi)發(fā)的效率,這篇文章主要介紹了mybatis-plus邏輯刪除自動(dòng)填充更新時(shí)間問(wèn)題,需要的朋友可以參考下2022-07-07基于mybatis-plus QueryWrapper 排序的坑
這篇文章主要介紹了mybatis-plus QueryWrapper 排序的坑,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-01-01