關於 Java 中 char 佔用多少字節,網上眾說紛紜。本文通過源碼規範、內存模型、編碼轉換實驗三個維度,徹底釐清這一問題。
char 是 **無符號 16 位** Unicode 代碼單元,佔 **2 字節(16 bits)**。\\u0000 (0) ~ \\uFFFF (65535)char 通常為 1 字節有本質區別。public class CharByteSizeTest {
public static void main(String[] args) throws Exception {
char c = '中'; // 單個漢字
String s = "中"; // 長度為1的字符串
// 1. char 轉 byte[](按 Unicode 大端序)
byte[] charBytes = new byte[2];
charBytes[0] = (byte) ((c & 0xFF00) >> 8);
charBytes[1] = (byte) (c & 0xFF);
System.out.println("char '中' 轉 byte[] 長度: " + charBytes.length); // 2
// 2. String.getBytes(encoding) 取決於編碼
System.out.println("UTF-8 編碼 byte[] 長度: " + s.getBytes("UTF-8").length); // 3
System.out.println("GBK 編碼 byte[] 長度: " + s.getBytes("GBK").length); // 2
System.out.println("UTF-16BE 編碼 byte[] 長度: " + s.getBytes("UTF-16BE").length); // 2 (+2 BOM 如果用 UTF-16)
}
}
輸出:
char '中' 轉 byte[] 長度: 2 UTF-8 編碼 byte[] 長度: 3 GBK 編碼 byte[] 長度: 2 UTF-16BE 編碼 byte[] 長度: 2
| 概念 | 大小 | 說明 |
|---|---|---|
char 類型變量 | 2 字節 | JVM 內存中固定佔用,存儲 UTF-16 代碼單元 |
String 底層存儲 | 2 字節/字符 (Java 9+ Compact Strings 優化後可能為 1 字節/拉丁字符) | 內部用 byte[] + coder 標識編碼 |
| 字符序列化/網絡傳輸 | 視編碼而定 | UTF-8 中文 3 字節,GBK 2 字節,UTF-16 2 字節 |
char 與 Java char。char 存儲大小,而非所有編碼下的字節數。String.getBytes() 返回 char 數組大小」——返回的是**指定編碼**的字節數組,預設用平台默認編碼。s.getBytes(StandardCharsets.UTF_8)byte[] buf = s.getBytes(StandardCharsets.UTF_8) 而非 s.length() * 2char 只能表示基本多文種平面(BMP)字符,增補字符需用 int 代碼點或 String.codePointCount()。總結:Java char 永遠佔 2 字節,這是語言規範與 JVM 內存模型共同決定的;而「一個漢字佔幾字節」取決於具體編碼方案,二者不可混淆。