== 比较是否为同一对象(地址),equals() 比较内容是否相等(需重写);基本类型只能用 ==,string 和包装类等须用 equals() 判值,自定义类需重写 equals() 和 hashcode()。

直接说重点:== 看的是“是不是同一个东西”,equals() 看的是“内容一不一样”——但前提是这个类重写了 equals()。
基本类型只能用 ==
int、char、boolean 这些没有对象概念,根本调不了 equals()。用 == 比值就行,安全又自然。
- int a = 5; int b = 5; → a == b 是 true
- float x = 1.0f; double y = 1.0; → x == y 也是 true(自动类型提升后值相等)
- 试图写 a.equals(b) 会编译报错:基本类型没有方法
字符串比较别踩 == 的坑
String 是最常被误用的类型。字面量可能复用常量池,new 出来的一定在堆里——== 结果不稳定,equals() 才可靠。
- String s1 = "abc"; String s2 = "abc"; → s1 == s2 可能为 true(常量池优化)
- String s3 = new String("abc"); String s4 = new String("abc"); → s3 == s4 一定是 false
- 但 s1.equals(s3)、s3.equals(s4) 全是 true ——String 重写了 equals(),比的是字符序列
- 记住口诀:判内容,无条件用 equals()
自定义类必须重写 equals() 才有意义
新建一个 Person 类,默认的 equals() 和 == 完全一样,只认地址。要按姓名+年龄判断是否为同一人,就得自己写逻辑。
- 重写时先判 this == obj(避免空指针且提升效率)
- 再判 obj 是否为 null 或类型不匹配
- 最后逐字段比较,字符串用 Objects.equals(a, b),数值直接 ==
- 配套必须重写 hashCode(),否则放进 HashMap/HashSet 会出问题
包装类(Integer、Boolean 等)有缓存陷阱
Integer 在 -128 到 127 范围内用 == 有时碰巧对,但纯属巧合,不可依赖。
- Integer a = 100; Integer b = 100; → a == b 通常为 true(共享缓存对象)
- Integer c = 200; Integer d = 200; → c == d 很可能为 false(超出缓存,各自 new)
- 无论数值多少,a.equals(b) 始终按值比较,结果稳定
- 原则:只要是比较“值”,一律用 equals();== 只用于确认是否同一实例











