openJDK之JDK9的String

    衷心建議讀者閱讀源碼,這篇內容比較簡單。java

    openJDK9開始,String的底層實現不同了,具體內容以下。數組

1.openJDK8的String

    先來看下openJDK8的String的底層,以下圖1.1所示:ui

               

                                         圖1.1 底層上使用的是char[],即char數組編碼

    每一個char佔16個bit,Character.SIZE的值是16。spa

2.openJDK9中的String

                 

                                                  圖2.1 openJDK9的底層上使用byte[]設計

 

    openJDK9中這麼設計的緣由,是由於大部分的String實際上是Latin-1,若是熟悉ASCII之類的編碼就好理解了,Latin-1只是佔有了不多的bit位,用char來存儲浪費了不少的空間。3d

    openJDK9中,字符若是是Latin-1,那麼只用一個byte來存儲,不然用倆個byte來存儲。圖2.1中的coder的值只有倆個,即LATIN1或者UTF16,以下圖2.2所示code

                   

                                                                             圖2.2blog

    來看個有特色的方法,charAt(index),在openJDK9上是怎麼實現的,以下圖2.3所示,時序圖以下圖2.4所示:繼承

                 

                                                        圖2.3 openJDK9中charAt(index)的實現

                     

                                                              圖2.4

    注:圖2.4中步驟3和步驟5是if-else的關係,沒怎麼畫對。

          

                                               圖2.5 StringLatin1的charAt的實現

          

                                                 圖2.6 StringUTF16中charAt的實現

    注:圖2.6中StringUTF16的charAt實現較爲複雜,由於它要從byte[]數組中取出倆個byte,組爲char。

3.openJDK9中的AbstractStringBuilder

    openJDK9中,AbstractStringBilder的底層上也是用了byte[],以下圖3.1所示:

     

                                               圖3.1 AbstractStringBuilder的底層上也是byte[]

    AbstractStringBuilder的底層上使用byte[],意味着StringBuilder和StringBuffer用的也是byte[],爲何這麼說,由於StringBuilder和StringBuffer繼承自AbstractStringBuilder。

    建議讀者閱讀源碼。

Reference:

  1. openJDK源碼
  2. https://stackoverflow.com/questions/44178432/difference-between-compact-strings-and-compressed-strings-in-java-9/44179353
相關文章
相關標籤/搜索