java中char固定占2字节,以utf-16编码存储unicode码点,大端序存放;本质是0~65535无符号整数,与short等宽但无负值;与byte转换需指定编码,string逻辑上由char序列构成。

Java 中的 char 类型在内存中固定占 2 个字节(16 位),采用无符号 UTF-16 编码方式存储 Unicode 字符。它不是“字符本身”,而是该字符在 Unicode 码表中的数值编号——比如 '中' 对应 \u4e2d,存入内存的就是十六进制 4E2D 的两个字节。
char 的内存布局:高位在前,连续存放
每个 char 按大端序(Big-Endian)存储:高位字节放在低地址,低位字节放在高地址。例如 char c = '\u4e2d'(汉字“中”),其 Unicode 值为 0x4E2D,在内存中依次存放 0x4E 和 0x2D 两个字节。
- char 数组(如
char[] cs = {'A', '中'})在堆上分配连续内存,长度为数组长度 × 2字节 - 单个 char 变量在栈或对象字段中也严格占 2 字节,不会因 ASCII 字符而压缩
- 即使值是 'A'(U+0041),仍用两个字节存
0x00 0x41,而非一个字节
char 与整数的双向映射:本质就是无符号 short
char 在 JVM 内部被当作 0~65535 范围的无符号整数处理,和 short 占相同空间但无负值。赋值、运算、比较都基于这个数值。
- 可直接用整数字面量初始化:
char c = 65等价于'A' - 参与算术运算时自动提升为
int:char c = 'a' + 1→ 得到'b'(98) - 转成 int 查编码:
(int)'中'返回 20013;转回 char:(char)20013还是 '中'
char 与 byte 的转换需明确编码意图
单个 char 不能直接等价于一个 byte,因为前者 16 位、后者 8 位。转换必须指定字符编码(如 UTF-8、ISO-8859-1),否则会丢失信息或乱码。
- ASCII 范围内(\u0000–\u007F)可安全截断:
byte b = (byte)'A'→65 - 汉字等需编码器:
"中".getBytes(StandardCharsets.UTF_8)得到 3 字节[0xE4, 0xB8, 0xAD],不是简单拆char - 若硬要拆
char为两个byte(仅限 UTF-16BE 场景):high = (byte)(c >> 8); low = (byte)(c & 0xFF)
String 与 char[] 的底层关系:互为镜像
String 内部在 JDK 9+ 使用 byte[] + coder 优化存储,但逻辑上仍由 char 序列构成;toCharArray() 返回的是语义一致的副本,每个元素占 2 字节。
-
"Hi".toCharArray()→['H', 'i'],数组长度为 2,内存占用 4 字节 -
new String(new char[]{'你', '好'})→ 正确还原字符串,不依赖平台默认编码 - 避免用
new String(byteArr)无参构造,会使用系统默认编码,易出错
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











