java~CompactStrings字符(fu)壓縮技(ji)術
概念
在 Java 中,char 和 byte 類型(xing)占用的(de)存儲(chu)空間是不同的(de)。
-
char類型:char是 16 位無符號的 Unicode 字符類型,用于表示單個字符。在 Java 中,char類型占用 2 個字(zi)節(16 位)的存(cun)儲空間。 -
byte類型:byte是 8 位有符號整數類型,表示范圍在 -128 到 127 之間的整數。在 Java 中,byte類型(xing)占用 1 個字(zi)節(8 位)的存儲空間。
需要注意的是,雖然 char 和 byte 在 Java 中分別占用不同的存儲空間,但它們表示的數據類型和范圍也是不同的。char 用于表示字符,而 byte 用(yong)于表示整(zheng)數。在處理數據時(shi),應根據具體的需求和數據類型選(xuan)擇合(he)適的類型。
char(0~65535)
char 在 Java 中(zhong)(zhong)占用 2 個字節(16 位)的(de)空間是因為(wei) Java 使(shi)用的(de)是 Unicode 字符編碼(ma),其中(zhong)(zhong)字符的(de)表(biao)示(shi)范圍為(wei) 0 到(dao) 65535(即 2^16-1)。
Unicode 是一種國際標準字符集,為世界上幾乎所有的字符分配了唯一的標識符。它包含了各種語言的字符、符號、表情等。為了能夠表示這么多的字符,Java 選擇了使用 2 個字節(16 位)來存儲 char 類型。
Java 的 char 類型使(shi)(shi)用的(de)是(shi) UTF-16 編(bian)碼,它是(shi)一種可變(bian)長(chang)度的(de)編(bian)碼方式,可以使(shi)(shi)用 2 個字節來表示大部(bu)分的(de)字符,但對于一些(xie)特殊字符(如表情符號),可能需要使(shi)(shi)用額外的(de)代碼點(dian)進行編(bian)碼。
需要注意的是,Unicode 字符集實際上定義了超過 65536 個字符。為了表示超出 65535 的字符,Unicode 使用了一種擴展編碼方式,稱為 UTF-16 編碼。UTF-16 編碼使用了一種叫作代理對(Surrogate Pair)的技術,將一個字符表示為兩個 char 類型的編碼單元。
因此,雖然 char 類型(xing)的范圍是 0 到(dao) 65535,但實(shi)際上可以表示更多(duo)的字符。在(zai)處理(li)(li) Unicode 字符時,需要特別注意代理(li)(li)對(dui)的處理(li)(li),以確(que)保正確(que)地處理(li)(li)和(he)顯示字符。
byte(-128~127)
在 Java 中,byte 是(shi)一個基本數(shu)據類(lei)型(xing),用(yong)于表示(shi) 8 位的(de)有(you)符號整數(shu)。它的(de)取值范圍為(wei) -128 到 127。
byte 類型通常用于處理字節數據,例如讀取和寫入二進制文件、網絡傳輸中的字節流、加密算法等。由于 byte 類型占用的空間較小,因此在需要節省內存或處理字節級數據的情況下,經常使用 byte 類型。
以下是一些關于 byte 類(lei)型的特點和用法:
-
取值范圍:
byte類型的取值范圍為 -128 到 127。可以通過Byte.MIN_VALUE和Byte.MAX_VALUE常量(liang)來獲取最小值和最大值。 -
內存占用:
byte類(lei)型占用 1 個字節(jie)(8 位)的存儲空間(jian)。 -
字節操作:
byte類型適用于處理字節級數據,例如讀取和寫入二進制文件、網絡傳輸中的字節流等。可以使用輸入輸出流、緩沖流等類來讀寫byte數據。 -
數組:可以創建
byte數組來存儲一組字節數據。例如,byte[] data = new byte[10];創建了一個長度為 10 的byte數組。 -
類型轉換:
byte類型可以與其他整數類型進行相互轉換。可以使用類型轉換運算符(如(byte) value)將其他整數類型轉換為byte類型,或者將byte類型轉(zhuan)換為其他整(zheng)數類型。
需要注意的是,在進行 byte 類型的運算時,會發生整數提升。也就是說,byte 類型的操作數會先被提升為 int 類型(xing),然后(hou)進行運算。
byte a = 10;
byte b = 20;
byte c = (byte) (a + b); // 需要進行類型轉換
總而言之,byte 類(lei)型在 Java 中是用于表(biao)示 8 位有符號整數(shu)的數(shu)據類(lei)型,適(shi)用于處理字節級數(shu)據和節省內存的場景。
java9對字符串存儲的優化Compact Strings(緊湊字符串)
Java 9 對字符串的(de)優化(hua)主要集中(zhong)在字符串存儲和(he)處理(li)方面,引入(ru)了一(yi)項(xiang)被稱(cheng)為 Compact Strings(緊湊字符串)的(de)改進。Compact Strings 的(de)目標是減(jian)少(shao)字符串在內存中(zhong)的(de)占用(yong)空(kong)間,提高性能和(he)效率。
在 Java 8 及之前的版本中,字符(fu)串內(nei)部使用(yong) char 數組來(lai)存(cun)儲字符(fu)數據,并(bing)使用(yong)額外(wai)的 int 型字段記錄字符(fu)串的偏移量和(he)長度(du)。這種表示(shi)方式在包含大量 ASCII 字符(fu)的字符(fu)串中會造成空間浪費,因為(wei)每個字符(fu)仍然(ran)占用(yong) 2 個字節的存(cun)儲空間。
Java 9 引入了 Compact Strings 的(de)(de)概念,對于僅包含 Latin-1 字符(fu)集(ji)(即(ji) Unicode 編(bian)碼范圍(wei)在 U+0000 至 U+00FF 之間)的(de)(de)字符(fu)串,使用字節數(shu)組(zu)存(cun)儲數(shu)據,每個字符(fu)只占用 1 個字節。這樣(yang)可以大大減少這類字符(fu)串的(de)(de)內存(cun)占用。對于包含非(fei) Latin-1 字符(fu)的(de)(de)字符(fu)串,仍(reng)然(ran)使用 char 數(shu)組(zu)存(cun)儲數(shu)據,每個字符(fu)占用 2 個字節。
Compact Strings 的(de)優化(hua)帶(dai)來了兩(liang)個主要的(de)好處:
-
內存占用(yong)減少:對于(yu)僅(jin)包含 Latin-1 字符的字符串,在內存中(zhong)占用(yong)的空間減少一半,從(cong)而可以(yi)降(jiang)低內存消(xiao)耗。
-
性(xing)能(neng)提升:減(jian)少了(le)字符串的(de)內(nei)存占(zhan)用,可以減(jian)少內(nei)存的(de)分(fen)配和垃圾回收的(de)頻率,從而提高了(le)性(xing)能(neng)和效率。
需(xu)要注意的(de)(de)是,Compact Strings 僅適用于字(zi)(zi)符串(chuan)對象的(de)(de)內部表示方(fang)(fang)式,對于開發(fa)(fa)者來說(shuo),字(zi)(zi)符串(chuan)的(de)(de)使用方(fang)(fang)式和(he)(he) API 并沒有變化。開發(fa)(fa)者無需(xu)對現(xian)有的(de)(de)代碼進行修改,可以繼續使用字(zi)(zi)符串(chuan)相關(guan)的(de)(de)方(fang)(fang)法和(he)(he)操作。
這項優化(hua)是在(zai)底層(ceng)實現層(ceng)面上進(jin)行的,旨在(zai)提(ti)高 Java 運行時(shi)的性能(neng)和內存利用(yong)率(lv),使(shi)開(kai)發者(zhe)能(neng)夠更高效(xiao)地處理字符(fu)串數據。
-XX:+CompactStrings
在 Java 命令行啟動時,可以通過使用 -XX:+CompactStrings 參數(shu)來開(kai)啟 Compact Strings。該參數(shu)告(gao)訴 Java 虛(xu)擬機在(zai)啟動時啟用緊(jin)湊字符(fu)串(Compact Strings)優化。
以下(xia)是使(shi)用 Java 命令行啟(qi)動并開啟(qi) Compact Strings 的示例:
java -XX:+CompactStrings -jar YourJarFile.jar
在上述示例中,-XX:+CompactStrings 參數指示 Java 虛擬機開啟 Compact Strings 優化。-jar YourJarFile.jar 部(bu)分是指定要執行的(de) JAR 文(wen)件。
請注意,Compact Strings 優化是默認開啟的,可以在不使用 -XX:+CompactStrings 參(can)數(shu)的情況下自動啟用。但(dan)如果(guo)需要明確指定開(kai)啟或禁用 Compact Strings,可以(yi)使用相應的命令行參(can)數(shu)。