搜尋
首頁Javajava教程深入解析JAVA中字串常數池與緩衝池理解與作用

本篇文章為大家帶來了關於java的相關知識,其中主要介紹了字串常數池和緩衝池的理解與作用,字串池與常數池是完全不同的兩個東西,但是很多地方都喜歡把它們混為一談,很容易讓初學者產生誤解,在這裡我想好好討論一下它們,希望對大家有幫助。

深入解析JAVA中字串常數池與緩衝池理解與作用

推薦學習:《java學習教學

字串池也可以稱為字串常數池,我認為這個名稱就是產生誤解的根源,有些人說著說著就把字串三個字省略了,只剩下了常數池.. . 所以為了避免誤解,我建議在指涉字串物件的快取池的時候,就直接稱之為字串池

#1 常數池

常數池分為兩個類型,一是.class檔案中靜態的常數池,二是.class檔案中的靜態常數池被載入到JVM中而形成的運行時常數池

1.1 靜態常數池

.class檔案中的常數池可以看作一個數組,數組中儲存了一些常數,當需要在字節碼指令中用到這個常數的時候,就透過陣列的索引來存取它。

看下面的程式碼:

 String m = "hellohellohellohellohello";
 String n = "hellohellohellohellohello";

它在字節碼中將會是這種形式:

 // 常量池:
 #1 hellohellohellohellohello
 #2 ...
 ...
 ----------------------------
 
 String m = #1;
 String n = #1;

當然,這只是一個簡化的版本,實際上要更複雜(實際的版本可以看文章末尾參考資料部分裡面貼出的那個回答,目前可以先只考慮簡化的版本)

注意,在這個裡面存儲的字符串常量只是一個簡單的UTF8編碼的位元組序列,而不是Java的字串對象,它就和你在一個txt文字中儲存的字串一樣,我們用UTF8格式來開啟一個.class文件,可以看到hellohellohellohellohello是可以被解析的:

1.2 運行時常數池

理解了靜態的常數池之後,運行時常數池就很容易想明白了。簡單來說,執行時間常數池就是.class檔案中的靜態常數池在JVM中的執行時間表示,每一個.class檔案的靜態常數池都會產生一個對應的執行時間常數池。等到JVM在解釋String m = #1這條指令時,它可以去這個類別的執行時間常數池中找出#1的定義。

2 字串池

字串池是Java為了重複使用String物件而設定的快取池,Java1.7之前設定在方法區上,儲存的是String物件;Java1.7之後設定在堆上,保存的是String物件的引用,String物件本身存在於堆上的其他位置。下文以Java1.7之後的情況為標準。

繼續上面的例子。當JVM在解釋String m = #1時,它已經從運行時常數池拿到了對應的UTF8序列,接下來,它會在字串池中尋找和這個UTF8序列對應的String對象,並把這個對象的引用賦值給m。你可能會好奇這個String被創建的時機,根據R大的這篇文章,在這條語句所在的類別被載入時,如果字串池中已經存在對應的物件了,那麼就什麼都不做,如果不存在,就會建立一個對應的String對象,並把其引用放入池中。

除了字串池,IntegerLong等Wrapper類型也有自己的快取池,例如Integer會快取從-128~127的Integer對象,當使用字面量賦值或Integer.valueOf()時,如果池中存在相應的對象,就會返回池中的對象,只有當池中沒有時才會在堆上建立新物件。

不過,和字串池不同的時,這些Wrapper池不會像字串池一樣可以增長,也就是池中的物件數目是固定的,Integer池中只會有-128~127 。

基本型別對應的緩衝池如下:

boolean values true and false
 all byte values
 short values between -128 and 127
 int values between -128 and 127
 char in the range \u0000 to \u007F

在jdk 1.8 所有的數值類別緩衝池中,Integer 的緩衝池IntegerCache 很特殊,這個緩衝池的下界是- 128,上界預設是127,但這個上界是可調的,在啟動jvm 的時候,透過-XX:AutoBoxCacheMax= 來指定這個緩衝池的大小,該選項在JVM 初始化的時候會設定一個名為java.lang .IntegerCache.high 系統屬性,然後IntegerCache 初始化的時候就會讀取該系統屬性來決定上界。

推薦學習:《java教學

以上是深入解析JAVA中字串常數池與緩衝池理解與作用的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文轉載於:CSDN。如有侵權,請聯絡admin@php.cn刪除
Java開發的哪些方面取決於平台?Java開發的哪些方面取決於平台?Apr 26, 2025 am 12:19 AM

JavadevelovermentIrelyPlatForm-DeTueTososeVeralFactors.1)JVMVariationsAffectPerformanceNandBehaviorAcroSsdifferentos.2)Nativelibrariesviajnijniiniininiinniinindrododerplatefform.3)

在不同平台上運行Java代碼時是否存在性能差異?為什麼?在不同平台上運行Java代碼時是否存在性能差異?為什麼?Apr 26, 2025 am 12:15 AM

Java代碼在不同平台上運行時會有性能差異。 1)JVM的實現和優化策略不同,如OracleJDK和OpenJDK。 2)操作系統的特性,如內存管理和線程調度,也會影響性能。 3)可以通過選擇合適的JVM、調整JVM參數和代碼優化來提升性能。

Java平台獨立性有什麼局限性?Java平台獨立性有什麼局限性?Apr 26, 2025 am 12:10 AM

Java'splatFormentenceHaslimitations不包括PerformanceOverhead,versionCompatibilityIsissues,挑戰WithnativelibraryIntegration,Platform-SpecificFeatures,andjvminstallation/jvminstallation/jvmintenance/jeartenance.therefactorscomplicatorscomplicatethe“ writeOnce”

解釋平台獨立性和跨平台發展之間的差異。解釋平台獨立性和跨平台發展之間的差異。Apr 26, 2025 am 12:08 AM

PlatformIndependendecealLowsProgramStormonanyPlograwsStormanyPlatFormWithOutModification,而LileCross-PlatFormDevelopmentRequiredquiresMomePlatform-specificAdjustments.platFormIndependence,EneblesuniveByjava,EnablesuniversUniversAleversalexecutionbutmayCotutionButMayComproMisePerformance.cross.cross.cross-platformd

即時(JIT)彙編如何影響Java的性能和平台獨立性?即時(JIT)彙編如何影響Java的性能和平台獨立性?Apr 26, 2025 am 12:02 AM

JITcompilationinJavaenhancesperformancewhilemaintainingplatformindependence.1)Itdynamicallytranslatesbytecodeintonativemachinecodeatruntime,optimizingfrequentlyusedcode.2)TheJVMremainsplatform-independent,allowingthesameJavaapplicationtorunondifferen

為什麼Java是開發跨平台桌面應用程序的流行選擇?為什麼Java是開發跨平台桌面應用程序的流行選擇?Apr 25, 2025 am 12:23 AM

javaispopularforcross-platformdesktopapplicationsduetoits“ writeonce,runany where”哲學。 1)itusesbytiesebyTecodeThatrunsonAnyJvm-備用Platform.2)librarieslikeslikeslikeswingingandjavafxhelpcreatenative-lookingenative-lookinguisis.3)

討論可能需要在Java中編寫平台特定代碼的情況。討論可能需要在Java中編寫平台特定代碼的情況。Apr 25, 2025 am 12:22 AM

在Java中編寫平台特定代碼的原因包括訪問特定操作系統功能、與特定硬件交互和優化性能。 1)使用JNA或JNI訪問Windows註冊表;2)通過JNI與Linux特定硬件驅動程序交互;3)通過JNI使用Metal優化macOS上的遊戲性能。儘管如此,編寫平台特定代碼會影響代碼的可移植性、增加複雜性、可能帶來性能開銷和安全風險。

與平台獨立性相關的Java開發的未來趨勢是什麼?與平台獨立性相關的Java開發的未來趨勢是什麼?Apr 25, 2025 am 12:12 AM

Java將通過雲原生應用、多平台部署和跨語言互操作進一步提昇平台獨立性。 1)雲原生應用將使用GraalVM和Quarkus提升啟動速度。 2)Java將擴展到嵌入式設備、移動設備和量子計算機。 3)通過GraalVM,Java將與Python、JavaScript等語言無縫集成,增強跨語言互操作性。

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

DVWA

DVWA

Damn Vulnerable Web App (DVWA) 是一個PHP/MySQL的Web應用程序,非常容易受到攻擊。它的主要目標是成為安全專業人員在合法環境中測試自己的技能和工具的輔助工具,幫助Web開發人員更好地理解保護網路應用程式的過程,並幫助教師/學生在課堂環境中教授/學習Web應用程式安全性。 DVWA的目標是透過簡單直接的介面練習一些最常見的Web漏洞,難度各不相同。請注意,該軟體中

WebStorm Mac版

WebStorm Mac版

好用的JavaScript開發工具

Atom編輯器mac版下載

Atom編輯器mac版下載

最受歡迎的的開源編輯器

EditPlus 中文破解版

EditPlus 中文破解版

體積小,語法高亮,不支援程式碼提示功能

MinGW - Minimalist GNU for Windows

MinGW - Minimalist GNU for Windows

這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。