使用==/!=比较Java Character包装类型是否安全?
比较
Character类型时使用==/!=是否安全? 结论
不安全,仅在特定场景下返回符合预期的结果,存在值相同但==返回false的场景,比较包装类的原始值建议优先使用.equals()方法。
核心原理
Java 对大部分包装类型实现了自动装箱缓存机制,其中Character的默认缓存范围是 ASCII 码对应的值区间[0, 127]:
- 自动装箱(比如直接把char字面量赋值给Character变量)时,如果值在上述缓存区间内,JVM会直接复用缓存里的同一个对象,这时候用
==比较地址刚好和值比较的结果一致。你提供的示例里字符'd'对应的ASCII值是100,属于缓存范围,所以输出true。 - 只要字符值超出
[0, 127]的范围,自动装箱时会生成新的Character对象,哪怕两个对象的原始值完全相同,==比较对象地址也会返回false。
反例代码
public static void main(String[] args) { // '汉'的Unicode编码为27721,远大于127,不会走缓存 Character c1 = '汉'; Character c2 = '汉'; System.out.println(c1 == c2); // 输出false System.out.println(c1.equals(c2)); // 输出true // 也可以转为基本类型char后再用==比较 System.out.println((char)c1 == (char)c2); // 输出true }
最佳实践
- 所有包装类型(Integer、Long、Character等)要比较原始值时,优先使用
.equals()方法,避免因缓存机制踩坑 - 也可以先把包装类对象转为对应的基本类型,再用
==/!=比较
内容的提问来源于stack exchange,提问作者user7858768
相关产品推荐
相关产品推荐

