首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java中char類型佔用字節數深度解析

     編輯:Java 相關知識

關於 Java 中 char 佔用多少字節,網上眾說紛紜。本文通過源碼規範、內存模型、編碼轉換實驗三個維度,徹底釐清這一問題。

一、語言規範定論

  • Java Language Specification 明確規定:char 是 **無符號 16 位** Unicode 代碼單元,佔 **2 字節(16 bits)**。
  • 範圍:\\u0000 (0) ~ \\uFFFF (65535)
  • 這與 C/C++ 中 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 字節

四、常見誤區澄清

  1. 誤區:「char 是 1 字節」——混淆了 C/C++ char 與 Java char。
  2. 誤區:「一個漢字佔 2 字節」——這是指 char 存儲大小,而非所有編碼下的字節數。
  3. 誤區:「String.getBytes() 返回 char 數組大小」——返回的是**指定編碼**的字節數組,預設用平台默認編碼。

五、最佳實踐建議

  • 涉及網絡/文件 I/O 時,**顯式指定編碼**:s.getBytes(StandardCharsets.UTF_8)
  • 計算緩衝區大小時,區分「字符數」與「字節數」:byte[] buf = s.getBytes(StandardCharsets.UTF_8) 而非 s.length() * 2
  • 處理增補字符(Emoji、生僻字)時,記住單個 char 只能表示基本多文種平面(BMP)字符,增補字符需用 int 代碼點或 String.codePointCount()。

總結:Java char 永遠佔 2 字節,這是語言規範與 JVM 內存模型共同決定的;而「一個漢字佔幾字節」取決於具體編碼方案,二者不可混淆。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved