博客 / 詳情

返回

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

簡介

String的底層存儲是什麼?相信大部分人都會説是數組。如果要是再問一句,那麼是以什麼數組來存儲呢?相信不同的人有不同的答案。

在JDK9之前,String的底層存儲結構是char[],一個char需要佔用兩個字節的存儲單位。

據説是JDK的開發人員經過調研了成千上萬的應用程序的heap dump信息,然後得出了一個結論:大部分的String都是以Latin-1字符編碼來表示的,只需要一個字節存儲就夠了,兩個字節完全是浪費。

據説他們用了大數據+人工智能,得出的結論由不得我們不信。

於是在JDK9之後,字符串的底層存儲變成了byte[]。

更多內容請訪問www.flydean.com

底層實現

先看下java9之前的String是怎麼實現的:

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。

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

歡迎關注我的公眾號:程序那些事,更多精彩等着您!

user avatar ran_agppr 頭像 smile_58bd2c1f62ea0 頭像 acfasj 頭像
3 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.