最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

深度解析Java常量池中的Integer緩沖池和String常量池

 更新時(shí)間:2026年05月29日 09:01:54   作者:身如柳絮隨風(fēng)揚(yáng)  
為了減少對(duì)象重復(fù)創(chuàng)建、提升運(yùn)行時(shí)效率,Java 內(nèi)部提供了兩種重要的優(yōu)化機(jī)制Integer 緩沖池(IntegerCache)和 String 常量池(String Pool),本文將深入剖析兩大常量池的底層實(shí)現(xiàn)、工作流程、適用范圍,并通過流程圖和代碼示例幫助你徹底掌握

1. 引言

在 Java 開發(fā)中,內(nèi)存和性能始終是程序員關(guān)注的重點(diǎn)。為了減少對(duì)象重復(fù)創(chuàng)建、提升運(yùn)行時(shí)效率,Java 內(nèi)部提供了兩種重要的優(yōu)化機(jī)制:Integer 緩沖池(IntegerCache)和 String 常量池(String Pool)。前者針對(duì)整型包裝類,后者針對(duì)字符串。理解它們的工作原理和使用邊界,不僅能寫出更高效的代碼,還能輕松應(yīng)對(duì)相關(guān)面試題。

本文將深入剖析兩大常量池的底層實(shí)現(xiàn)、工作流程、適用范圍,并通過流程圖和代碼示例幫助你徹底掌握。

2. Integer 緩沖池(IntegerCache)

2.1 什么是 Integer 緩沖池

Integer 類內(nèi)部維護(hù)了一個(gè)靜態(tài)內(nèi)部類 IntegerCache,它預(yù)先創(chuàng)建并緩存了一定范圍內(nèi)的整數(shù)值對(duì)應(yīng)的 Integer 對(duì)象。當(dāng)我們通過 Integer.valueOf(int) 或自動(dòng)裝箱(如 Integer i = 100)獲取整數(shù)對(duì)象時(shí),如果該整數(shù)落在緩存范圍內(nèi),則直接返回緩存中的對(duì)象引用,而不是新建對(duì)象。這大大節(jié)省了內(nèi)存,也提升了性能。

2.2 緩存范圍與配置

  • 默認(rèn)范圍-128127(包含兩端)。
  • 最小值固定為 -128,無法修改。
  • 最大值可以通過 JVM 啟動(dòng)參數(shù)調(diào)整:-XX:AutoBoxCacheMax=<size>。例如 -XX:AutoBoxCacheMax=2000 可將緩存上限擴(kuò)展至 2000。
// 查看緩存范圍(JDK 8+)
System.out.println(IntegerCache.high);  // 默認(rèn) 127,可配置

2.3 工作原理(流程圖)

2.4 源碼解析(基于 JDK 8)

public static Integer valueOf(int i) {
    if (i >= IntegerCache.low && i <= IntegerCache.high)
        return IntegerCache.cache[i + (-IntegerCache.low)];
    return new Integer(i);
}

IntegerCache 在類加載時(shí)就會(huì)初始化,將 lowhigh 范圍內(nèi)的所有整數(shù)提前創(chuàng)建好放入 cache[] 數(shù)組中。

2.5 代碼演示

Integer a = 100;   // 自動(dòng)裝箱,使用緩存
Integer b = 100;
System.out.println(a == b);   // true,同一對(duì)象

Integer c = 200;
Integer d = 200;
System.out.println(c == d);   // false,超出緩存范圍,不同對(duì)象

// 使用 new 關(guān)鍵字始終創(chuàng)建新對(duì)象
Integer e = new Integer(100);
Integer f = new Integer(100);
System.out.println(e == f);   // false

注意:應(yīng)當(dāng)使用 equals() 比較數(shù)值,而不是 ==,除非明確要判斷是否同一對(duì)象。

2.6 其他包裝類的類似緩存

除了 IntegerByte、ShortLong 也都有類似的緩存機(jī)制,但范圍略有不同:

  • Byte:全部值(-128~127)均緩存。
  • ShortLong:僅緩存 -128~127。
  • Character:緩存 0~127。
  • Boolean:緩存 TRUEFALSE 兩個(gè)常量。
Long l1 = 100L;
Long l2 = 100L;
System.out.println(l1 == l2);   // true

3. String 常量池(String Pool)

3.1 什么是 String 常量池?

String 常量池是 JVM 內(nèi)存中一塊特殊區(qū)域(JDK 7 之前位于方法區(qū)/永久代,JDK 7 之后移至堆中),用于存儲(chǔ)字符串常量。其核心目的是復(fù)用相同內(nèi)容的字符串對(duì)象,避免重復(fù)創(chuàng)建。

3.2 創(chuàng)建字符串的兩種方式

方式代碼示例對(duì)象創(chuàng)建位置是否復(fù)用常量池
字面量String s = "hello";常量池是,相同字符串只存一份
new 關(guān)鍵字String s = new String("hello");堆(新對(duì)象)否,但字面量 "hello" 本身仍會(huì)進(jìn)入常量池

3.3 工作流程(流程圖)

3.4 代碼演示

// 字面量方式
String s1 = "hello";
String s2 = "hello";
System.out.println(s1 == s2);   // true,指向常量池同一對(duì)象

// new 方式
String s3 = new String("hello");
System.out.println(s1 == s3);   // false,不同對(duì)象

// intern() 方法:手動(dòng)將字符串放入常量池
String s4 = s3.intern();
System.out.println(s1 == s4);   // true

3.5 常量池大小與配置

  • 常量池中條目數(shù)量可以通過 -XX:StringTableSize 參數(shù)設(shè)置(例如 -XX:StringTableSize=100000),默認(rèn)值隨 JDK 版本變化(JDK 8 默認(rèn) 60013)。
  • 過小的表會(huì)增大哈希沖突,影響性能;過大會(huì)浪費(fèi)內(nèi)存。

4. 兩大常量池對(duì)比

特性Integer 緩沖池String 常量池
所屬類Integer 內(nèi)部類 IntegerCacheJVM 運(yùn)行時(shí)數(shù)據(jù)區(qū)
存儲(chǔ)內(nèi)容特定范圍的 Integer 對(duì)象字符串常量
觸發(fā)方式自動(dòng)裝箱 / Integer.valueOf()字符串字面量 / intern()
默認(rèn)范圍-128 ~ 127(可調(diào)上限)所有字符串,無范圍限制
內(nèi)存位置堆(緩存的 Integer 對(duì)象在堆中)堆(JDK 7+)
可否配置可調(diào)整最大值(JVM 參數(shù))可調(diào)整表大小(JVM 參數(shù))
其他類似緩存Byte, Short, Long 部分范圍

5. 常見面試題

Q1:Integer a = 128; Integer b = 128;問a == b結(jié)果?

false。因?yàn)?128 超出默認(rèn)緩存最大值 127,會(huì)分別創(chuàng)建兩個(gè)不同對(duì)象。

Q2:String s = new String("abc")創(chuàng)建了幾個(gè)對(duì)象?

:最多兩個(gè)。如果常量池中還沒有 "abc",則在常量池創(chuàng)建一個(gè),再在堆上創(chuàng)建一個(gè)新對(duì)象;如果常量池已存在,則只創(chuàng)建一個(gè)堆對(duì)象。

Q3:如何使Integer緩存擴(kuò)大到 2000?

:使用 JVM 參數(shù) -XX:AutoBoxCacheMax=2000。

Q4:以下代碼輸出什么?

String s1 = "java";
String s2 = "ja" + "va";
System.out.println(s1 == s2);

true。因?yàn)?"ja" + "va" 是編譯期常量折疊,結(jié)果直接指向常量池中的 "java"。

6. 最佳實(shí)踐與注意事項(xiàng)

  • 使用 equals() 而不是 == 比較 Integer 或 String 的值。
  • 對(duì)于頻繁使用的整數(shù)值,盡量保持在緩存范圍內(nèi),避免對(duì)象頻繁創(chuàng)建。
  • 字符串拼接時(shí),若涉及變量,應(yīng)使用 StringBuilder 而不是 +(循環(huán)內(nèi)尤其注意)。
  • 不要過度依賴 intern(),它雖然能手動(dòng)入池,但大量使用可能拉低性能。
  • 合理設(shè)置 JVM 參數(shù)優(yōu)化緩存大小(比如系統(tǒng)中大量使用 0~5000 的整數(shù),可調(diào)高 AutoBoxCacheMax)。

7. 總結(jié)

Java 的 Integer 緩沖池和 String 常量池都是語言層面的優(yōu)秀優(yōu)化機(jī)制,它們通過對(duì)象復(fù)用的方式減少了不必要的內(nèi)存開銷和 GC 壓力。掌握它們的原理,能夠幫助你寫出更高效的代碼,也能讓你在性能調(diào)優(yōu)時(shí)游刃有余。

記憶總結(jié)

  • IntegerCache:數(shù)字小范圍,-128 起頭,valueOf 復(fù)用。
  • String Pool:字面量共享,new 必新建,intern 可手動(dòng)入池。

到此這篇關(guān)于深度解析Java常量池中的Integer緩沖池和String常量池的文章就介紹到這了,更多相關(guān)Java常量池內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java處理圖片實(shí)現(xiàn)base64編碼轉(zhuǎn)換

    Java處理圖片實(shí)現(xiàn)base64編碼轉(zhuǎn)換

    這篇文章主要介紹了Java處理圖片實(shí)現(xiàn)base64編碼轉(zhuǎn)換,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-02-02
  • Java中實(shí)現(xiàn)時(shí)間類型轉(zhuǎn)換的代碼詳解

    Java中實(shí)現(xiàn)時(shí)間類型轉(zhuǎn)換的代碼詳解

    這篇文章主要為大家詳細(xì)介紹了Java中實(shí)現(xiàn)時(shí)間類型轉(zhuǎn)換的相關(guān)方法,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,有需要的小伙伴可以參考下
    2023-09-09
  • 使用Java和高德地圖API將經(jīng)緯度轉(zhuǎn)換為地理位置信息的步驟

    使用Java和高德地圖API將經(jīng)緯度轉(zhuǎn)換為地理位置信息的步驟

    這篇文章詳細(xì)介紹了如何將GPS坐標(biāo)轉(zhuǎn)換為人類可讀的地理位置,介紹了環(huán)境準(zhǔn)備、代碼實(shí)現(xiàn)、異常處理及優(yōu)化步驟,首先創(chuàng)建LocationFinder類,實(shí)現(xiàn)getLocationFromCoordinates方法,利用高德逆地理編碼API轉(zhuǎn)換坐標(biāo),文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-09-09
  • 詳解如何修改idea配置文件位置從C盤更改到D盤

    詳解如何修改idea配置文件位置從C盤更改到D盤

    這篇文章主要給大家介紹了關(guān)于如何將idea的配置文件從默認(rèn)的C盤調(diào)整到D盤,從而節(jié)省C盤使用空間,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,需要的朋友可以參考下
    2023-10-10
  • IDEA修改idea.vmoptions后,IDEA無法打開的解決方案

    IDEA修改idea.vmoptions后,IDEA無法打開的解決方案

    文章介紹了在IDEA中因錯(cuò)誤修改啟動(dòng)參數(shù)導(dǎo)致無法啟動(dòng)的問題,指出正確的修改文件位置應(yīng)在破解插件目錄下的idea.vmoptions,并分享了個(gè)人經(jīng)驗(yàn)供參考
    2025-10-10
  • Java流操作之?dāng)?shù)據(jù)流實(shí)例代碼

    Java流操作之?dāng)?shù)據(jù)流實(shí)例代碼

    這篇文章主要介紹了Java流操作之?dāng)?shù)據(jù)流實(shí)例代碼,具有一定借鑒價(jià)值,需要的朋友可以參考下
    2018-01-01
  • 加速spring/springboot應(yīng)用啟動(dòng)速度詳解

    加速spring/springboot應(yīng)用啟動(dòng)速度詳解

    這篇文章主要介紹了加速spring/springboot應(yīng)用啟動(dòng)速度詳解,本文通過實(shí)例代碼給大家介紹的非常詳細(xì)對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-07-07
  • java去掉文本中多余的空格與空行實(shí)例代碼

    java去掉文本中多余的空格與空行實(shí)例代碼

    在最近的一個(gè)項(xiàng)目中發(fā)現(xiàn)用戶提交的數(shù)據(jù)中多了很多多余的空格與空行,為了不影響使用,只能想辦法去掉了,下面這篇文章主要給大家介紹了關(guān)于java去掉文本中多余的空格與空行的相關(guān)資料,需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-08-08
  • JAVA 對(duì)50取余數(shù)的五種方法試下

    JAVA 對(duì)50取余數(shù)的五種方法試下

    在數(shù)學(xué)計(jì)算中經(jīng)常會(huì)遇到余數(shù),本文主要介紹了JAVA 對(duì)50取余數(shù)的五種方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-03-03
  • Mybatis中@Param的用法和作用詳解

    Mybatis中@Param的用法和作用詳解

    這篇文章主要介紹了Mybatis中@Param的用法和作用,在文中給大家補(bǔ)充了spring中@param和mybatis中@param使用區(qū)別,需要的朋友可以參考下
    2017-09-09

最新評(píng)論

绥棱县| 东海县| 克拉玛依市| 和田县| 玛多县| 五河县| 武冈市| 顺义区| 乌拉特后旗| 墨玉县| 澎湖县| 红桥区| 吉木萨尔县| 黔南| 湘潭县| 略阳县| 临高县| 阜康市| 渝北区| 周口市| 沅江市| 陆河县| 龙游县| 射阳县| 萨嘎县| 玛沁县| 潮安县| 玉环县| 泽普县| 沅陵县| 旅游| 新宁县| 大安市| 华蓥市| 大连市| 湾仔区| 舟山市| 桂林市| 中阳县| 新乡市| 根河市|