天天看點

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

目錄

  • ​​簡介​​
  • ​​底層實作​​
  • ​​總結​​

簡介

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

在JDK9之前,String的底層存儲結構是char[],一個char需要占用兩個位元組的存儲機關。

據說是JDK的開發人員經過調研了成千上萬的應用程式的heap dump資訊,然後得出了一個結論:大部分的String都是以Latin-1字元編碼來表示的,隻需要一個位元組存儲就夠了,兩個位元組完全是浪費。

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

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

底層實作

先看下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程式那些事