91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

JAVA中字符串常量池和緩沖池的作用是什么

發布時間:2022-03-18 17:31:44 來源:億速云 閱讀:233 作者:iii 欄目:編程語言

這篇“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是可以被解析的:JAVA中字符串常量池和緩沖池的作用是什么

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中字符串常量池和緩沖池的作用是什么”這篇文章的內容,相信大家都有了一定的了解,希望小編分享的內容對大家有幫助,若想了解更多相關的知識內容,請關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

丰顺县| 百色市| 南阳市| 吉木乃县| 萨迦县| 方正县| 宿州市| 靖边县| 监利县| 高要市| 临武县| 梁山县| 吴忠市| 鱼台县| 铜陵市| 麟游县| 眉山市| 宽甸| 栖霞市| 桑日县| 静安区| 龙岩市| 亚东县| 竹北市| 二连浩特市| 宁化县| 上栗县| 浮梁县| 甘南县| 正蓝旗| 曲周县| 沧州市| 大城县| 墨竹工卡县| 炉霍县| 曲麻莱县| 奇台县| 白水县| 卫辉市| 甘孜| 沂水县|