天天看點

Java 9 中的字元串(String)壓縮的改進

我們都知道 Strings 在 Java 中使用 char[] 數組來實作的。

Java 9 中的字元串(String)壓縮的改進

每一個 char[] 數組中的元素将會使用 2 個位元組(byte)的存儲空間,這是因為 Java 最初的實作使用 UTF-16 字元集。

如果你不需要存儲其他語言,你的語言隻有英文,或者 ASCII 碼就可以滿足的情況下,Java String 使用的 char[] 數組中存儲的字元元素還是會使用 UTF-16 字元集,那麼就會導緻存儲一個字元的時候,我們使用了 2 位元組,16 位。但是,因為我們又全是存儲為16 位,那麼存儲的這個字元的前 8 位全部都會為 0。

因為 ASCII 使用單位元組存儲,這明顯是一個存儲空間的浪費。

實際上,很多字元存儲都需要使用 2 位元組,比如 UTF-8,比如 GBK,但是針對因為和 拉丁文 LATIN-1 使用 1 個位元組的存儲就夠了,很顯然這裡有一個可以改進的空間。

在 JDK 9 之前,Java 不管什麼字元都一股腦的使用 2 位元組存儲,在 JDK 9 以後,Java 對這裡進行了改進。

同時我們知道 Java 是使用 String Pool 來存儲的,String Pool 通常使用了 JVM 的 heap 記憶體空間,Heap 記憶體空間又是 JVM 垃圾清理程式活動的地方。

在老的設計中,String 占用了 2 個位元組,但是很多時候可能用不到,如果我們對這裡進行了改進的話,我們也能提高垃圾清理程式的工作量。

顯然這個是需要重新考慮的問題。