1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        JDK 9 對(duì)字符串 String 的優(yōu)化,挺有意思!

        共 3363字,需瀏覽 7分鐘

         ·

        2021-03-13 00:18


        String類可以說(shuō)是Java編程中使用最多的類了,如果能對(duì)String字符串的性能進(jìn)行優(yōu)化,那么程序的性能必然能大幅提升。

        這不JDK9就對(duì)String字符串進(jìn)行了改進(jìn)升級(jí),在某些場(chǎng)景下可以讓String字符串內(nèi)存減少一半,進(jìn)而減少JVM的GC次數(shù)。

        String的底層存儲(chǔ)

        在面試的時(shí)候我們通常會(huì)說(shuō)String字符串有不可變的特性,每次都要?jiǎng)?chuàng)建新的字符串。那么,為什么String字符串是不可變的呢?

        先來(lái)看一下String字符串的底層存儲(chǔ)結(jié)構(gòu):

        public final class String
            implements java.io.Serializable, Comparable<String>, CharSequence {
            
            private final char value[];

            public String() {
                this.value = "".value;
            }

            public String(String original) {
                this.value = original.value;
                this.hash = original.hash;
            }
            // ...
        }    

        看到什么了?當(dāng)我們new一個(gè)String對(duì)象時(shí),對(duì)應(yīng)的字符串其實(shí)是以char數(shù)組的形式存儲(chǔ)在String對(duì)象內(nèi)部。而這個(gè)char數(shù)組是final的,也就是說(shuō)不可變的。

        這也就是為什么我們說(shuō)String字符串擁有不可變的特性,當(dāng)字符串改變了,char數(shù)組不可變,就只能創(chuàng)建一個(gè)新的對(duì)象,新的char數(shù)組了。

        底層存儲(chǔ)的優(yōu)化

        上面說(shuō)的情況是JDK8及以前版本,到了JDK9,String中字符串的存儲(chǔ)不再用char數(shù)組了,改用byte數(shù)組。

        public final class String
            implements java.io.Serializable, Comparable<String>, CharSequence {

            @Stable
            private final byte[] value;

            private final byte coder;
            
            @Native static final byte LATIN1 = 0;
            @Native static final byte UTF16  = 1;
            
            static final boolean COMPACT_STRINGS;
          
            public String() {
                this.value = "".value;
                this.coder = "".coder;
            }

            @HotSpotIntrinsicCandidate
            public String(String original) {
                this.value = original.value;
                this.coder = original.coder;
                this.hash = original.hash;
            }
            
            // ...
        }

        不僅將char數(shù)組改為byte數(shù)組,而且新增了一個(gè)coder的成員變量。

        在程序中,絕大多數(shù)字符串只包含英文字母數(shù)字等字符,使用Latin-1編碼,一個(gè)字符占用一個(gè)byte。如果使用char,一個(gè)char要占用兩個(gè)byte,會(huì)占用雙倍的內(nèi)存空間。

        但是,如果字符串中使用了中文等超出Latin-1表示范圍的字符,使用Latin-1就沒(méi)辦法表示了。這時(shí)JDK會(huì)使用UTF-16編碼,那么占用的空間和舊版(使用char[])是一樣的。

        coder變量代表編碼的格式,目前String支持兩種編碼格式Latin-1和UTF-16。Latin-1需要用一個(gè)字節(jié)來(lái)存儲(chǔ),而UTF-16需要使用2個(gè)字節(jié)或者4個(gè)字節(jié)來(lái)存儲(chǔ)。

        據(jù)說(shuō)這一改進(jìn)方案是JDK的開(kāi)發(fā)人員用大數(shù)據(jù)和人工能智能,調(diào)研了成千上萬(wàn)的應(yīng)用程序的heapdump信息后,得出:大部分的String都是以Latin-1字符編碼來(lái)表示的,只需要一個(gè)字節(jié)存儲(chǔ)就夠了,兩個(gè)字節(jié)完全是浪費(fèi)。

        COMPACT_STRINGS屬性則是用來(lái)控制是否開(kāi)啟String的compact功能。默認(rèn)情況下是開(kāi)啟的??梢允褂?XX:-CompactStrings參數(shù)來(lái)對(duì)此功能進(jìn)行關(guān)閉。

        改進(jìn)的好處

        改進(jìn)的好處是非常明顯的,首先如果項(xiàng)目中使用Latin-1字符集居多,內(nèi)存的占用大幅度減少,同樣的硬件配置可以支撐更多的業(yè)務(wù)。

        當(dāng)內(nèi)存減少之后,進(jìn)一步導(dǎo)致減少GC次數(shù),進(jìn)而減少Stop-The-World的頻次,同樣會(huì)提升系統(tǒng)的性能。

        總結(jié)

        隨著JDK的迭代String字符串的內(nèi)存結(jié)構(gòu)及方法等也在不斷的發(fā)展演變,一方面是精于求精的態(tài)度,另一個(gè)更重要的原因是String在代碼中很常見(jiàn),并且它往往是JVM中占用內(nèi)存最多的一類數(shù)據(jù),因此對(duì)它(String)的優(yōu)化收益非常大。


        瀏覽 69
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        評(píng)論
        圖片
        表情
        推薦
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            人人草在线观看 | 99在线视频精品 | 国产精品香蕉 | 波多野结衣国产区42部 | 丝袜老师踩我的喷水 | 成人无码www免费视频苹果版 | 搞鸡巴视频 | 天天夜夜狠狠 | 日韩无码123区 | 奇米影视7777色综合 |