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

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM