站長資訊網
        最全最豐富的資訊網站

        深入解析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是可以被解析的:深入解析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教程》

        贊(0)
        分享到: 更多 (0)
        網站地圖   滬ICP備18035694號-2    滬公網安備31011702889846號
        主站蜘蛛池模板: 国产精品自在拍一区二区不卡| 亚洲精品无码MV在线观看| 欧美精品福利在线视频 | 国产精品无码午夜福利| 久久99精品国产麻豆不卡| 3D动漫精品一区二区三区| 无码人妻精品一区二区三区久久久 | 综合在线视频精品专区| 91亚洲精品麻豆| 精品国产福利久久久| 久久精品亚洲精品国产色婷 | 国产精品一区二区久久精品无码| 国产精品99久久免费观看| 亚洲国产一二三精品无码| 亚洲国产综合精品一区在线播放 | 精品久久久久久无码免费| 久久精品国产影库免费看| 久久久久女人精品毛片| 最新国产精品精品视频| 欧美日韩国产成人高清视频,欧美日韩在线精品一 | 国产精品伦一区二区三级视频| 香蕉99久久国产综合精品宅男自| 国产精品 羞羞答答在线| 国产a精品视频| 全球AV集中精品导航福利| 色欲久久久天天天综合网精品 | 久久久久99精品成人片试看| 亚洲综合精品香蕉久久网 | 999精品在线| 国产成人vr精品a视频| 国产精品亚洲аv无码播放| 久久精品国产亚洲av高清漫画 | 久久亚洲国产成人精品性色| 日韩精品无码专区免费播放| 亚洲AV永久无码精品| 一本色道久久综合亚洲精品| 尤物TV国产精品看片在线| 亚洲爆乳精品无码一区二区三区| 日韩精品无码久久久久久| 亚洲精品国产成人99久久| 国产成人精品久久亚洲高清不卡 国产成人精品久久亚洲高清不卡 国产成人精品久久亚洲 |