Java中char固定占2字节,表示Unicode码点0–65535;运算时自动转int类型;String与byte[]转换需指定编码,避免乱码;字符转数字推荐c-'0',但需确保是'0'–'9'。

char 占 2 字节,但实际存储依赖编码
Java 中 char 类型固定占 2 字节(16 位),这是 JVM 规范定义的内存布局,与平台无关。它基于 Unicode 编码,可表示 0–65535 范围内的字符,包括英文、数字、中文、emoji 等。注意:这 2 字节是 Java 内存中 char 变量本身的大小,不是文件或网络传输时的字节长度。
实际序列化或转为字节数组时,编码方式起决定作用:
-
UTF-16BE(大端无 BOM):一个 char → 正好 2 字节,如
'A'→[0x00, 0x41] -
UTF-16(含 BOM):可能为 2 或 4 字节(BOM 占前 2 字节),如
"A"→ 4 字节 - UTF-8:ASCII 字符(如 'A')占 1 字节;中文(如 '中')占 3 字节;部分 emoji 占 4 字节
char 可直接参与数值运算,本质是 Unicode 码点
Java 允许对 char 做加减等算术操作,因为每个 char 在底层就是一个无符号整数(0–65535)。例如:
-
char c = 'A'; int i = c + 1;→i == 66('A' 的 Unicode 是 65) -
char d = '0'; int n = d - '0';→n == 0(常用于字符转数字) -
System.out.println('中' + 0);→ 输出20013('中' 的 Unicode 码点)
这种转换无需显式强制类型转换,编译器自动按 int 处理——char 运算结果总是 int 类型,哪怕两个 char 相加也一样。
立即学习“Java免费学习笔记(深入)”;
String 与 char 数组互转:明确区分“字符”和“字节”
String 是引用类型,内部用 char 数组(Java 9+ 优化为 byte[] + 编码标记),但对外仍以字符为单位。常见转换要注意语义差异:
-
String s = "abc"; char[] cs = s.toCharArray();→ 得到{'a','b','c'},长度为 3 -
byte[] bs = s.getBytes(StandardCharsets.UTF_8);→ 得到{97,98,99}(ASCII 下 3 字节),但"中".getBytes(UTF_8)是 3 字节 -
new String(bs, StandardCharsets.UTF_8)→ 必须指定编码,否则用平台默认编码,易乱码
特别提醒:s.getBytes() 不带参数时使用系统默认编码,跨环境极不稳定,生产代码必须显式传入 StandardCharsets。
字符转数字:安全写法与典型陷阱
将单个字符转为对应数字(如 '5' → 5),最可靠方式是利用 char 的数值本质:
-
推荐:
int digit = c - '0';—— 仅适用于 '0'–'9',编译期确定,零开销 -
通用但稍重:
Integer.parseInt(String.valueOf(c))—— 支持多位字符串,但有异常风险和对象开销 -
陷阱示例:
(int)c对 '0' 返回 48,不是 0;Character.digit(c, 10)更健壮(会校验范围并返回 -1 表示非法)
批量处理字符串数字时,优先用 Integer.parseInt(str.trim()),并始终包裹 try-catch 处理 NumberFormatException。


















