衷心建議讀者閱讀源碼,這篇內容比較簡單。java
openJDK9開始,String的底層實現不同了,具體內容以下。數組
先來看下openJDK8的String的底層,以下圖1.1所示:ui
圖1.1 底層上使用的是char[],即char數組編碼
每一個char佔16個bit,Character.SIZE的值是16。spa
圖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。
openJDK9中,AbstractStringBilder的底層上也是用了byte[],以下圖3.1所示:
圖3.1 AbstractStringBuilder的底層上也是byte[]
AbstractStringBuilder的底層上使用byte[],意味着StringBuilder和StringBuffer用的也是byte[],爲何這麼說,由於StringBuilder和StringBuffer繼承自AbstractStringBuilder。
建議讀者閱讀源碼。