欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

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

這篇“JAVA中字符串常量池和緩沖池的作用是什么”文章的知識(shí)點(diǎn)大部分人都不太理解,所以小編給大家總結(jié)了以下內(nèi)容,內(nèi)容詳細(xì),步驟清晰,具有一定的借鑒價(jià)值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來看看這篇“JAVA中字符串常量池和緩沖池的作用是什么”文章吧。

創(chuàng)新互聯(lián)從2013年創(chuàng)立,先為新沂等服務(wù)建站,新沂等地企業(yè),進(jìn)行企業(yè)商務(wù)咨詢服務(wù)。為新沂企業(yè)網(wǎng)站制作PC+手機(jī)+微官網(wǎng)三網(wǎng)同步一站式服務(wù)解決您的所有建站問題。

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

1 常量池

常量池分為兩個(gè)類型,一是.class文件中靜態(tài)的常量池,二是.class文件中的靜態(tài)常量池被加載到JVM中而形成的運(yùn)行時(shí)常量池

1.1 靜態(tài)常量池

.class文件中的常量池可以看作一個(gè)數(shù)組,數(shù)組中存儲(chǔ)了一些常量,當(dāng)需要在字節(jié)碼指令中用到這個(gè)常量的時(shí)候,就通過數(shù)組的索引來訪問它。

看下面的代碼:

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

它在字節(jié)碼中將會(huì)是這種形式:

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

當(dāng)然,這只是一個(gè)簡(jiǎn)化的版本,實(shí)際上要更加復(fù)雜 (實(shí)際的版本可以看文章末尾參考資料部分里面貼出的那個(gè)回答,目前可以先只考慮簡(jiǎn)化的版本)

注意,在這個(gè)里面存儲(chǔ)的字符串常量只是一個(gè)簡(jiǎn)單的UTF8編碼的字節(jié)序列,而不是Java的字符串對(duì)象,它就和你在一個(gè)txt文本中存儲(chǔ)的字符串一樣,我們用UTF8格式來打開一個(gè).class文件,可以看到hellohellohellohellohello是可以被解析的:JAVA中字符串常量池和緩沖池的作用是什么

1.2 運(yùn)行時(shí)常量池

理解了靜態(tài)的常量池之后,運(yùn)行時(shí)常量池就很容易想明白了。簡(jiǎn)單來說,運(yùn)行時(shí)常量池就是.class文件中的靜態(tài)常量池在JVM中的運(yùn)行時(shí)表示,每一個(gè).class文件的靜態(tài)常量池都會(huì)生成一個(gè)對(duì)應(yīng)的運(yùn)行時(shí)常量池。等到JVM在解釋String m = #1這條指令時(shí),它可以去這個(gè)類的運(yùn)行時(shí)常量池中查找#1的定義。

2 字符串池

字符串池是Java為了重用String對(duì)象而設(shè)置的一個(gè)緩存池,Java1.7之前設(shè)置在方法區(qū)上,保存的是String對(duì)象;Java1.7之后設(shè)置在堆上,保存的是String對(duì)象的引用,String對(duì)象本身存在于堆上的其他位置。下文中以Java1.7之后的情況為標(biāo)準(zhǔn)。

繼續(xù)上面的例子。當(dāng)JVM在解釋String m = #1時(shí),它已經(jīng)從運(yùn)行時(shí)常量池拿到了相應(yīng)的UTF8序列,接下來,它會(huì)在字符串池中尋找和這個(gè)UTF8序列對(duì)應(yīng)的String對(duì)象,并把這個(gè)對(duì)象的引用賦值給m。你可能會(huì)好奇這個(gè)String被創(chuàng)建的時(shí)機(jī),根據(jù)R大的這篇文章,在這條語句所在的類被加載時(shí),如果字符串池中已經(jīng)存在對(duì)應(yīng)的對(duì)象了,那么就什么都不做,如果不存在,就會(huì)創(chuàng)建一個(gè)對(duì)應(yīng)的String對(duì)象,并把其引用放入池中。

除了字符串池,IntegerLong等Wrapper類型也有自己的緩存池,比如Integer會(huì)緩存從-128~127的Integer對(duì)象,當(dāng)使用字面量賦值或者Integer.valueOf()時(shí),如果池中存在相應(yīng)的對(duì)象,就會(huì)返回池中的對(duì)象,只有當(dāng)池中沒有時(shí)才會(huì)在堆上創(chuàng)建新對(duì)象。

不過,和字符串池不同的時(shí),這些Wrapper池不會(huì)像字符串池一樣可以增長,也就是池中的對(duì)象數(shù)目是固定的,Integer池中只會(huì)有-128~127。

基本類型對(duì)應(yīng)的緩沖池如下:

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 所有的數(shù)值類緩沖池中,Integer 的緩沖池 IntegerCache 很特殊,這個(gè)緩沖池的下界是 - 128,上界默認(rèn)是 127,但是這個(gè)上界是可調(diào)的,在啟動(dòng) jvm 的時(shí)候,通過 -XX:AutoBoxCacheMax= 來指定這個(gè)緩沖池的大小,該選項(xiàng)在 JVM 初始化的時(shí)候會(huì)設(shè)定一個(gè)名為 java.lang.IntegerCache.high 系統(tǒng)屬性,然后 IntegerCache 初始化的時(shí)候就會(huì)讀取該系統(tǒng)屬性來決定上界。

以上就是關(guān)于“JAVA中字符串常量池和緩沖池的作用是什么”這篇文章的內(nèi)容,相信大家都有了一定的了解,希望小編分享的內(nèi)容對(duì)大家有幫助,若想了解更多相關(guān)的知識(shí)內(nèi)容,請(qǐng)關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。

網(wǎng)站名稱:JAVA中字符串常量池和緩沖池的作用是什么
文章網(wǎng)址:http://chinadenli.net/article36/gsghpg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供響應(yīng)式網(wǎng)站虛擬主機(jī)搜索引擎優(yōu)化關(guān)鍵詞優(yōu)化企業(yè)建站網(wǎng)站排名

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

網(wǎng)站托管運(yùn)營