Java中int與Integer的區(qū)別詳解及常見問題解決
1. 本質(zhì)與存儲方式
特性 | int | Integer |
---|---|---|
類型 | 基本數(shù)據(jù)類型(Primitive Type) | 引用類型(包裝類,Object 的子類) |
存儲位置 | 棧內(nèi)存(Stack) | 堆內(nèi)存(Heap) |
內(nèi)存占用 | 4 字節(jié)(固定) | 對象頭 + 4 字節(jié)值 ≈ 16-24 字節(jié) |
示例:
int a = 10; // 棧中直接存儲值 10 Integer b = Integer.valueOf(10); // 堆中存儲對象,變量 b 存儲對象引用
2. 默認值
場景 | int | Integer |
---|---|---|
未初始化值 | 0 | null |
集合存儲 | 無法直接存入集合(需自動裝箱為 Integer ) | 可直接存入集合(如 List<Integer> ) |
示例:
int num1; // 默認值為 0 Integer num2; // 默認值為 null(可能引發(fā) NullPointerException) List<Integer> list = new ArrayList<>(); list.add(10); // 自動裝箱:int → Integer
3. 功能與方法
能力 | int | Integer |
---|---|---|
方法支持 | 無方法,僅存儲值 | 提供數(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. 自動裝箱與拆箱
自動裝箱(Autoboxing):Java 編譯器自動將
int
轉(zhuǎn)換為Integer
。自動拆箱(Unboxing):自動將
Integer
轉(zhuǎn)換為int
。
示例:
Integer a = 10; // 自動裝箱:等價于 Integer.valueOf(10) int b = a; // 自動拆箱:等價于 a.intValue()
性能注意: 自動裝箱/拆箱會帶來額外開銷,高頻操作時建議直接使用 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(復用緩存對象)
6. 緩存機制(IntegerCache)
緩存范圍:
Integer
類默認緩存-128
到127
之間的值。目的:減少頻繁創(chuàng)建小數(shù)值對象,優(yōu)化內(nèi)存和性能。
擴展緩存:可通過 JVM 參數(shù)
-XX:AutoBoxCacheMax=<size>
調(diào)整上限。
示例:
Integer a = 127; // 從緩存獲取 Integer b = 127; // 復用緩存對象 System.out.println(a == b); // true ? Integer c = 128; // 超出緩存范圍,新建對象 Integer d = 128; // 新建另一個對象 System.out.println(c == d); // false
7. 使用場景
場景 | 推薦使用 | 原因 |
---|---|---|
高頻計算 | int | 避免自動裝箱開銷,性能更優(yōu) |
集合存儲 | Integer | 集合泛型不支持基本類型(如 List<int> 非法) |
數(shù)據(jù)庫映射 | Integer | 數(shù)據(jù)庫字段可能為 NULL,int 無法表示 |
API 設計 | Integer | 方法參數(shù)或返回值可能需區(qū)分“無值”(null) |
8. 常見問題與陷阱
(1) NullPointerException
Integer value = null; int num = value; // 運行時拋出 NullPointerException(自動拆箱調(diào)用 intValue())
(2) 性能損耗
// 高頻循環(huán)中自動裝箱導致性能下降 long sum = 0; for (Integer i = 0; i < 100000; i++) { // 每次循環(huán)觸發(fā)裝箱 sum += i; }
(3) 比較錯誤
Integer a = 200; Integer b = 200; if (a == b) { // false,應使用 equals() 或 intValue() 比較 System.out.println("Equal"); }
總結(jié)
維度 | int | Integer |
---|---|---|
類型 | 基本數(shù)據(jù)類型 | 包裝類(引用類型) |
內(nèi)存 | 棧存儲,高效 | 堆存儲,有對象開銷 |
空值 | 不支持 | 支持(需防空指針) |
方法 | 無 | 提供工具方法 |
適用場景 | 高頻計算、性能敏感場景 | 集合、數(shù)據(jù)庫映射、API 設計 |
選擇建議:
優(yōu)先使用
int
:在不需要對象特性(如 null 值、方法操作)時,提升性能。必須使用
Integer
:在泛型集合、數(shù)據(jù)庫映射或需要區(qū)分“無值”場景時。
到此這篇關(guān)于Java中int與Integer的區(qū)別詳解及常見問題解決的文章就介紹到這了,更多相關(guān)Java中int與Integer區(qū)別內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot?整合MyBatis+MyBatis-Plus+MyBatisX插件使用
本文主要介紹了SpringBoot?整合MyBatis+MyBatis-Plus+MyBatisX插件使用,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2024-04-04Java計時器StopWatch實現(xiàn)方法代碼實例
這篇文章主要介紹了Java計時器StopWatch實現(xiàn)方法代碼實例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2020-07-07SpringBoot基于HttpMessageConverter實現(xiàn)全局日期格式化
這篇文章主要介紹了SpringBoot基于HttpMessageConverter實現(xiàn)全局日期格式化,使用Jackson消息轉(zhuǎn)換器,非常具有實用價值,需要的朋友可以參考下2018-12-12spring aop之@AfterReturning不生效問題及解決
這篇文章主要介紹了spring aop之@AfterReturning不生效問題及解決方案,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-05-05基于Java代碼實現(xiàn)數(shù)字在數(shù)組中出現(xiàn)次數(shù)超過一半
這篇文章主要介紹了基于Java代碼實現(xiàn)數(shù)字在數(shù)組中出現(xiàn)次數(shù)超過一半的相關(guān)資料,需要的朋友可以參考下2016-02-02SpringBoot+JavaMailSender實現(xiàn)騰訊企業(yè)郵箱配置
這篇文章主要介紹了SpringBoot+JavaMailSender實現(xiàn)騰訊企業(yè)郵箱配置,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2021-04-04關(guān)于mybatis-plus邏輯刪除自動填充更新時間的問題
mybatis-plus是對mybatis的增強,mybatis-plus更像是面向?qū)ο缶幊?,?shù)據(jù)庫基本CRUD的操作可以不用手動編寫SQL語句,大大提高了開發(fā)的效率,這篇文章主要介紹了mybatis-plus邏輯刪除自動填充更新時間問題,需要的朋友可以參考下2022-07-07基于mybatis-plus QueryWrapper 排序的坑
這篇文章主要介紹了mybatis-plus QueryWrapper 排序的坑,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-01-01