String的底層存儲是什麼?相信大部分人都會說是數組。若是要是再問一句,那麼是以什麼數組來存儲呢?相信不一樣的人有不一樣的答案。java
在JDK9以前,String的底層存儲結構是char[],一個char須要佔用兩個字節的存儲單位。數組
聽說是JDK的開發人員通過調研了成千上萬的應用程序的heap dump信息,而後得出了一個結論:大部分的String都是以Latin-1字符編碼來表示的,只須要一個字節存儲就夠了,兩個字節徹底是浪費。大數據
聽說他們用了大數據+人工智能,得出的結論由不得咱們不信。編碼
因而在JDK9以後,字符串的底層存儲變成了byte[]。人工智能
更多內容請訪問 www.flydean.com
先看下java9以前的String是怎麼實現的:code
public final class String implements java.io.Serializable, Comparable<String>, CharSequence { //The value is used for character storage. private final char value[]; }
再看下java9中String的實現和一些關鍵的變量:開發
public final class String implements java.io.Serializable, Comparable<String>, CharSequence { /** The value is used for character storage. */ @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; static { COMPACT_STRINGS = true; }
從代碼咱們能夠看到底層的存儲已經變成了byte[]。字符串
再看一下coder變量,coder表明編碼的格式,目前String支持兩種編碼格式LATIN1和UTF16。get
LATIN1須要用一個字節來存儲。而UTF16須要使用2個字節或者4個字節來存儲。博客
而COMPACT_STRINGS則是用來控制是否開啓String的compact功能。默認狀況下COMPACT_STRINGS功能是開啓的。
若是咱們想關閉COMPACT_STRINGS功能則可使用-XX:-CompactStrings參數。
本文講解了新的String實現和COMPACT_STRINGS模式的關閉方法。
本文做者:flydean程序那些事本文連接:http://www.flydean.com/jdk9-string-compact/
本文來源:flydean的博客
歡迎關注個人公衆號:程序那些事,更多精彩等着您!