JDK9的新特性:String壓縮和字符編碼

簡介

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的博客

歡迎關注個人公衆號:程序那些事,更多精彩等着您!

相關文章
相關標籤/搜索