# 概念 在 Java 中,`char` 和 `byte` 類型占用的存儲空間是不同的。 1. `char` 類型:`char` 是 16 位無符號的 Unicode 字元類型,用於表示單個字元。在 Java 中,`char` 類型占用 2 個位元組(16 位)的存儲空間。 2. `byte` 類型: ...
概念
在 Java 中,char
和 byte
類型占用的存儲空間是不同的。
-
char
類型:char
是 16 位無符號的 Unicode 字元類型,用於表示單個字元。在 Java 中,char
類型占用 2 個位元組(16 位)的存儲空間。 -
byte
類型:byte
是 8 位有符號整數類型,表示範圍在 -128 到 127 之間的整數。在 Java 中,byte
類型占用 1 個位元組(8 位)的存儲空間。
需要註意的是,雖然 char
和 byte
在 Java 中分別占用不同的存儲空間,但它們表示的數據類型和範圍也是不同的。char
用於表示字元,而 byte
用於表示整數。在處理數據時,應根據具體的需求和數據類型選擇合適的類型。
char(0~65535)
char
在 Java 中占用 2 個位元組(16 位)的空間是因為 Java 使用的是 Unicode 字元編碼,其中字元的表示範圍為 0 到 65535(即 2^16-1)。
Unicode 是一種國際標準字元集
,為世界上幾乎所有的字元分配了唯一的標識符。它包含了各種語言的字元、符號、表情等。為了能夠表示這麼多的字元,Java 選擇了使用 2 個位元組(16 位)來存儲 char
類型。
Java 的 char
類型使用的是 UTF-16 編碼,它是一種可變長度的編碼方式,可以使用 2 個位元組來表示大部分的字元,但對於一些特殊字元(如表情符號),可能需要使用額外的代碼點進行編碼。
需要註意的是,Unicode 字元集實際上定義了超過 65536 個字元。為了表示超出 65535 的字元,Unicode 使用了一種擴展編碼方式,稱為 UTF-16 編碼。UTF-16 編碼使用了一種叫作代理對(Surrogate Pair)的技術,將一個字元表示為兩個 char
類型的編碼單元。
因此,雖然 char
類型的範圍是 0 到 65535,但實際上可以表示更多的字元。在處理 Unicode 字元時,需要特別註意代理對的處理,以確保正確地處理和顯示字元。
byte(-128~127)
在 Java 中,byte
是一個基本數據類型,用於表示 8 位的有符號整數。它的取值範圍為 -128 到 127。
byte
類型通常用於處理位元組數據,例如讀取和寫入二進位文件、網路傳輸中的位元組流、加密演算法等。由於 byte
類型占用的空間較小,因此在需要節省記憶體或處理位元組級數據的情況下,經常使用 byte
類型。
以下是一些關於 byte
類型的特點和用法:
-
取值範圍:
byte
類型的取值範圍為 -128 到 127。可以通過Byte.MIN_VALUE
和Byte.MAX_VALUE
常量來獲取最小值和最大值。 -
記憶體占用:
byte
類型占用 1 個位元組(8 位)的存儲空間。 -
位元組操作:
byte
類型適用於處理位元組級數據,例如讀取和寫入二進位文件、網路傳輸中的位元組流等。可以使用輸入輸出流、緩衝流等類來讀寫byte
數據。 -
數組:可以創建
byte
數組來存儲一組位元組數據。例如,byte[] data = new byte[10];
創建了一個長度為 10 的byte
數組。 -
類型轉換:
byte
類型可以與其他整數類型進行相互轉換。可以使用類型轉換運算符(如(byte) value
)將其他整數類型轉換為byte
類型,或者將byte
類型轉換為其他整數類型。
需要註意的是,在進行 byte
類型的運算時,會發生整數提升。也就是說,byte
類型的操作數會先被提升為 int
類型,然後進行運算。
byte a = 10;
byte b = 20;
byte c = (byte) (a + b); // 需要進行類型轉換
總而言之,byte
類型在 Java 中是用於表示 8 位有符號整數的數據類型,適用於處理位元組級數據和節省記憶體的場景。
java9對字元串存儲的優化Compact Strings(緊湊字元串)
Java 9 對字元串的優化主要集中在字元串存儲和處理方面,引入了一項被稱為 Compact Strings(緊湊字元串)的改進。Compact Strings 的目標是減少字元串在記憶體中的占用空間,提高性能和效率。
在 Java 8 及之前的版本中,字元串內部使用 char 數組來存儲字元數據,並使用額外的 int 型欄位記錄字元串的偏移量和長度。這種表示方式在包含大量 ASCII 字元的字元串中會造成空間浪費,因為每個字元仍然占用 2 個位元組的存儲空間。
Java 9 引入了 Compact Strings 的概念,對於僅包含 Latin-1 字元集(即 Unicode 編碼範圍在 U+0000 至 U+00FF 之間)的字元串,使用位元組數組存儲數據,每個字元只占用 1 個位元組。這樣可以大大減少這類字元串的記憶體占用。對於包含非 Latin-1 字元的字元串,仍然使用 char 數組存儲數據,每個字元占用 2 個位元組。
Compact Strings 的優化帶來了兩個主要的好處:
-
記憶體占用減少:對於僅包含 Latin-1 字元的字元串,在記憶體中占用的空間減少一半,從而可以降低記憶體消耗。
-
性能提升:減少了字元串的記憶體占用,可以減少記憶體的分配和垃圾回收的頻率,從而提高了性能和效率。
需要註意的是,Compact Strings 僅適用於字元串對象的內部表示方式,對於開發者來說,字元串的使用方式和 API 並沒有變化。開發者無需對現有的代碼進行修改,可以繼續使用字元串相關的方法和操作。
這項優化是在底層實現層面上進行的,旨在提高 Java 運行時的性能和記憶體利用率,使開發者能夠更高效地處理字元串數據。
-XX:+CompactStrings
在 Java 命令行啟動時,可以通過使用 -XX:+CompactStrings
參數來開啟 Compact Strings。該參數告訴 Java 虛擬機在啟動時啟用緊湊字元串(Compact Strings)優化。
以下是使用 Java 命令行啟動並開啟 Compact Strings 的示例:
java -XX:+CompactStrings -jar YourJarFile.jar
在上述示例中,-XX:+CompactStrings
參數指示 Java 虛擬機開啟 Compact Strings 優化。-jar YourJarFile.jar
部分是指定要執行的 JAR 文件。
請註意,Compact Strings 優化是預設開啟的,可以在不使用 -XX:+CompactStrings
參數的情況下自動啟用。但如果需要明確指定開啟或禁用 Compact Strings,可以使用相應的命令行參數。
作者:倉儲大叔,張占嶺,
榮譽:微軟MVP
QQ:853066980
支付寶掃一掃,為大叔打賞!