Java中比较变量相等需区分值相等与引用相等:基本类型用==比较值,引用类型优先用equals()比较内容,避免直接用==;包装类因缓存机制导致==结果不可靠;自定义类须重写equals()和hashCode()。

Java中比较两个变量是否相等,关键在于区分“值相等”和“引用相等”,并根据变量类型(基本类型或引用类型)选择合适的方式。
基本类型用 == 比较值
int、double、char、boolean 等基本类型变量,直接用 == 判断数值是否相同:
- == 对基本类型比较的是实际存储的值
- 例如:
int a = 5; int b = 5;,a == b返回 true - 注意:浮点数(float/double)用 == 比较可能存在精度问题,建议用
Math.abs(a - b) 判断近似相等
引用类型慎用 ==,优先用 equals()
String、Integer、ArrayList 等引用类型,== 比较的是两个变量是否指向**同一个对象(内存地址)**,不是内容是否相同:
-
String s1 = "hello"; String s2 = "hello";→s1 == s2可能为 true(字符串常量池优化) -
String s1 = new String("hello"); String s2 = new String("hello");→s1 == s2一定为 false - 要比较内容是否一致,应调用 .equals() 方法:
s1.equals(s2)返回 true - 使用前建议判空,避免 NullPointerException:
Objects.equals(s1, s2)更安全
包装类的特殊性:== 在小整数范围内可能“碰巧”成立
Integer、Byte、Character 等包装类有缓存机制(如 Integer 缓存 -128 ~ 127),导致部分值用 == 比较会返回 true,但这不是可靠行为:
立即学习“Java免费学习笔记(深入)”;
-
Integer a = 100; Integer b = 100;→a == b是 true(命中缓存) -
Integer c = 200; Integer d = 200;→c == d很可能是 false(超出缓存范围) - 始终用
.equals()或Objects.equals()判断逻辑相等,不依赖 ==
自定义类要重写 equals() 和 hashCode()
如果自己写的类需要按业务字段判断是否相等,必须重写 equals() 方法(通常也需同步重写 hashCode()):
- 默认继承自 Object 的 equals() 等价于 ==,只比地址
- 重写后可按 id、name 等字段组合判断,例如:
return Objects.equals(this.id, other.id) && Objects.equals(this.name, other.name); - 若该类对象会放入 HashMap / HashSet,未重写 hashCode() 会导致逻辑异常










