<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          JDK9對String字符串的新一輪優(yōu)化,不可不知

          共 3597字,需瀏覽 8分鐘

           ·

          2021-03-11 13:22

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

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

          String的底層存儲

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

          先來看一下String字符串的底層存儲結(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一個String對象時,對應(yīng)的字符串其實是以char數(shù)組的形式存儲在String對象內(nèi)部。而這個char數(shù)組是final的,也就是說不可變的。

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

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

          上面說的情況是JDK8及以前版本,到了JDK9,String中字符串的存儲不再用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ù)組,而且新增了一個coder的成員變量。

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

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

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

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

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

          改進(jìn)的好處

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

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

          小結(jié)

          隨著JDK的迭代String字符串的內(nèi)存結(jié)構(gòu)及方法等也在不斷地進(jìn)行演變。這是因為String字符串往往是JVM中占用內(nèi)存最多的類,通過對它的改造升級,對性能的提升會更加明顯。


          往期推薦

          再一次實戰(zhàn)策略模式,真是太好用了

          Java自動拆箱空指針異常,救火隊員上線

          還不懂Java的泛型?只用這一篇文章,保證你面試對答如流

          放棄FastJson!一篇就夠,Jackson的功能原來如此之牛(萬字干貨)

          經(jīng)過多方調(diào)研,最終還是決定禁用FastJson!



          如果你覺得這篇文章不錯,那么,下篇通常會更好。添加微信好友,可備注“加群”(微信號:zhuan2quan)。

          一篇文章就看透技術(shù)本質(zhì)的人,
            和花一輩子都看不清的人,
            注定是截然不同的搬磚生涯。
          ▲ 按關(guān)注”程序新視界“,洞察技術(shù)內(nèi)幕
          瀏覽 49
          點贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  骚逼 无码| 午夜免费无码 | 91豆花网 | 人妻夜夜爽天天爽三区麻豆AV网站 | 亚洲免费欧洲 |