Java中包裝類的緩存機(jī)制詳細(xì)講解
Java中包裝類的緩存機(jī)制是為了提升性能、減少重復(fù)對象創(chuàng)建,其中以Integer的緩存最為典型。下面分三部分詳細(xì)講解:
一、Integer的緩存機(jī)制(重點)
Integer的緩存機(jī)制由IntegerCache內(nèi)部類實現(xiàn),核心邏輯是:預(yù)先創(chuàng)建并緩存一定范圍的Integer對象,當(dāng)需要使用該范圍的整數(shù)時,直接返回緩存中的實例,而非新創(chuàng)建對象。
1. 緩存范圍
默認(rèn)情況下,緩存范圍是 -128 ~ 127(Java規(guī)范強(qiáng)制要求)。
- 這個范圍是最常用的整數(shù)區(qū)間(如年齡、索引等),緩存后可大幅減少對象創(chuàng)建開銷。
- 可以通過JVM參數(shù)
XX:AutoBoxCacheMax=<size>調(diào)整上限(僅對127以上有效,下限-128固定),但不推薦(破壞規(guī)范一致性)。
2. 觸發(fā)場景
緩存僅在自動裝箱(基本類型→包裝類)或調(diào)用Integer.valueOf(int) 時生效,直接new Integer(int)會強(qiáng)制創(chuàng)建新對象(不使用緩存)。
代碼示例:
public class IntegerCacheDemo {
public static void main(String[] args) {
// 自動裝箱(觸發(fā)緩存)
Integer a = 127;
Integer b = 127;
System.out.println(a == b); // true(同一緩存對象)
// 超過緩存范圍
Integer c = 128;
Integer d = 128;
System.out.println(c == d); // false(新對象)
// 顯式調(diào)用valueOf(觸發(fā)緩存)
Integer e = Integer.valueOf(127);
Integer f = Integer.valueOf(127);
System.out.println(e == f); // true
// new關(guān)鍵字(不觸發(fā)緩存,強(qiáng)制新建)
Integer g = new Integer(127);
Integer h = new Integer(127);
System.out.println(g == h); // false(不同對象)
}
}
二、其他基本類型包裝類的緩存機(jī)制
除Integer外,部分包裝類也有緩存機(jī)制,但范圍和實現(xiàn)略有不同,總結(jié)如下:
| 包裝類 | 緩存范圍 | 說明 |
|---|---|---|
Byte | -128 ~ 127 | 全部緩存(因Byte取值范圍僅為-128~127) |
Short | -128 ~ 127 | 固定范圍,不可調(diào)整 |
Long | -128 ~ 127 | 固定范圍,不可調(diào)整 |
Character | 0 ~ 127 | 對應(yīng)ASCII字符(常用字符) |
Boolean | true 和 false | 僅緩存兩個靜態(tài)實例(Boolean.TRUE/FALSE) |
Float | 無緩存 | 浮點型取值范圍太廣,緩存無意義 |
Double | 無緩存 | 同上 |
代碼示例(其他包裝類):
// Byte緩存(全部范圍) Byte b1 = 127; Byte b2 = 127; System.out.println(b1 == b2); // true(緩存) // Character緩存(0~127) Character c1 = 'a'; // ASCII碼97,在緩存范圍 Character c2 = 'a'; System.out.println(c1 == c2); // true Character c3 = '中'; // Unicode碼20013,超出緩存 Character c4 = '中'; System.out.println(c3 == c4); // false // Boolean緩存 Boolean bool1 = true; Boolean bool2 = true; System.out.println(bool1 == bool2); // true(同一實例)
三、包裝類 vs 基本數(shù)據(jù)類型:使用場景對比
選擇的核心依據(jù)是:是否需要“對象特性”或“null值”。
1. 優(yōu)先用基本數(shù)據(jù)類型的場景
- 局部變量/方法參數(shù):用于臨時計算(如循環(huán)計數(shù)、數(shù)值運(yùn)算),存儲在棧內(nèi)存,訪問速度快,無額外對象開銷。
- 性能敏感場景:如高頻次計算、大數(shù)據(jù)量處理(避免自動裝箱/拆箱的性能損耗)。
- 明確不需要null值:基本類型不能為null,可避免
NullPointerException(如年齡、分?jǐn)?shù)等必然有值的場景)。
示例:
// 局部變量用基本類型(高效)
int count = 0;
for (int i = 0; i < 1000; i++) {
count += i; // 基本類型運(yùn)算效率高
}2. 必須用包裝類的場景
- 集合框架:集合(如
ArrayList、HashMap)只能存儲對象,不能直接存基本類型(需用包裝類)。 示例:List<Integer> list = new ArrayList<>();(不能寫List<int>)。 - 泛型:泛型參數(shù)必須是對象類型(如
class MyClass<T>,T不能是int,只能是Integer)。 - 需要表示“無值”狀態(tài):如數(shù)據(jù)庫查詢結(jié)果可能為null(用
Integer的null表示“未查詢到”,而int無法表示)。 - 反射/序列化:反射中方法參數(shù)、字段類型需用包裝類(如
Field.getType()返回包裝類類型);序列化時對象才能被傳輸。 - 工具類方法參數(shù):如
Integer.parseInt(String)、Objects.equals()等,需傳入包裝類或依賴對象方法。
3. 注意事項
- 自動裝箱/拆箱的坑:頻繁裝箱拆箱會產(chǎn)生額外對象(如
List<Integer>中添加int會自動裝箱),可能導(dǎo)致性能問題(可考慮Trove等專門的基本類型集合庫優(yōu)化)。 - ==與equals:包裝類用
==比較的是對象地址(緩存范圍內(nèi)除外),必須用equals比較值;基本類型直接用==比較值。 示例:Integer a=128; Integer b=128; a.equals(b) → true,但a==b → false。
總結(jié)
- 緩存機(jī)制是包裝類的優(yōu)化手段,僅
Byte/Short/Long/Character/Integer/Boolean有緩存,范圍各有不同。 - 基本類型適合簡單計算、局部變量(高效、無null風(fēng)險);包裝類適合集合、泛型、需null值的場景(依賴對象特性)。
實際開發(fā)中,根據(jù)是否需要“對象特性”或“null值”選擇即可,避免過度使用包裝類導(dǎo)致性能損耗。
到此這篇關(guān)于Java中包裝類的緩存機(jī)制詳細(xì)講解的文章就介紹到這了,更多相關(guān)Java包裝類緩存機(jī)制內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot中@EnableAutoConfiguration和@Configuration的區(qū)別
這篇文章主要介紹了SpringBoot中@EnableAutoConfiguration和@Configuration的區(qū)別,@SpringBootApplication相當(dāng)于@EnableAutoConfiguration,@ComponentScan,@Configuration三者的集合,需要的朋友可以參考下2023-08-08
一文帶你解決Java項目開發(fā)中java.lang.NoSuchMethodError的問題
在日常 Java 開發(fā)中,大家應(yīng)該都見過報錯java.lang.NoSuchMethodError的,本文就帶大家拆解一下問題的本質(zhì),結(jié)合實際案例演示如何排查和解決2025-09-09
Java StringBuilder類相關(guān)知識總結(jié)
這篇文章主要介紹了Java StringBuilder類相關(guān)知識總結(jié),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-02-02
SpringBoot整合Sharding-JDBC實現(xiàn)MySQL8讀寫分離
本文是一個基于SpringBoot整合Sharding-JDBC實現(xiàn)讀寫分離的極簡教程,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的可以了解一下2021-07-07
webuploader+springmvc實現(xiàn)圖片上傳功能
這篇文章主要為大家詳細(xì)介紹了webuploader+springmvc實現(xiàn)圖片上傳功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-09-09
SpringBoot中使用@Scheduled注解創(chuàng)建定時任務(wù)的實現(xiàn)
這篇文章主要介紹了SpringBoot中使用@Scheduled注解創(chuàng)建定時任務(wù)的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-06-06

