java中char是16位无符号整数,对应unicode值,用单引号声明,支持算术运算与string协同,但非对象、无方法,中文需注意代理对。

Java 中的 char 是唯一专门用于表示单个字符的基本数据类型,它不是字符串,也不是对象,而是一个 16 位无符号整数,直接对应 Unicode 编码值。
char 的声明与赋值规则
必须用单引号包裹单个字符,不能用双引号(那是 String);支持字母、数字、标点、中文、Unicode 转义序列等:
char c1 = 'A';char c2 = '中';char c3 = '\u4F60'; // 等价于 '你'char c4 = '\n'; // 换行符,合法转义字符char c5 = 65; // 直接用整数赋值,等价于 'A'(因为 'A' 的 Unicode 值是 65)
char 的数值本质与运算特性
它在底层就是 0–65535 的整数,因此天然支持算术运算和类型提升:
- 参与运算时自动提升为
int:例如'a' + 1结果是98(即'b'的编码) - 可显式转成其他整型:
short s = (short) 'Z';,但通常没必要 - 不能直接与
byte或short混合赋值(需强制转换),因 Java 不允许窄化隐式转换 - 注意无符号性:
char max = '\uFFFF'; int i = max + 1;得到65536,但不能把65536再赋给char(超出范围)
char 与字符串的交互方式
虽然 char 本身是基本类型,但它和 String 高度协同:
- 从字符串取字符:
char c = str.charAt(2);—— 返回的是基本类型值,不创建新对象 - 构建字符串:
"Hello " + 'W' + "orld"会自动将char转为字符串拼接 - 转为字符数组:
char[] cs = str.toCharArray();—— 获取底层可修改副本 - 注意:
String不可变,所有“修改”操作(如substring)都返回新对象;而char变量本身可直接重新赋值
常见误区与规避建议
很多问题源于混淆概念或忽略类型边界:
-
别把 char 当 byte 用:网络/文件 I/O 必须用
Writer(如OutputStreamWriter)配合编码写入字符,不能直接os.write((byte)c),否则中文等高位字符被截断乱码 -
instanceof 对 char 无效:它是基本类型,不继承
Object;需要类型判断时应改用包装类Character -
别误以为 char 有方法:它没有
.length()、.equals()等;要操作字符属性(如是否为数字),用Character.isDigit(c)等静态工具方法 -
中文字符安全:BMP 平面内(如常用汉字)一个
char就能表示;但补充平面(如某些 emoji)需两个char(代理对),此时应优先使用String.codePointAt()和Character.toChars()
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











