用==比较基本类型值或引用地址,equals()比较对象内容(需重写才有效);基本类型无equals();浮点数慎用==;String等重写equals()可比内容,未重写的引用类型equals()同==;null判断用==或Objects.equals();自定义类须重写equals()和hashCode()。

想确认“是不是同一个东西”,用 ==;想确认“内容一不一样”,用 equals()。关键不在语法,而在你真正想问的问题。
基本类型只能用 ==
int、char、boolean 等 8 种基本类型没有对象身份,不继承 Object,也没有 equals() 方法。写 int a = 5; a.equals(5) 会直接编译失败。
- 比较数值就靠 ==:比如
a == b、'A' == 65(自动类型提升后成立) - 浮点数慎用 ==:
0.1 + 0.2 == 0.3很可能为 false,这不是 equals 能解决的,得用 BigDecimal 或误差范围判断
引用类型:== 比地址,equals() 比内容(但得重写才有效)
String、Integer、ArrayList 等类重写了 equals(),所以能比内容;而 StringBuilder、Thread、自定义类(没重写时)的 equals() 行为和 == 完全一样——只比内存地址。
-
String s1 = new String("abc"); String s2 = new String("abc");→s1 == s2是 false,s1.equals(s2)是 true -
String a = "abc"; String b = "abc";→a == b是 true(字符串常量池复用) -
Integer x = 100; Integer y = 100;→x == y是 true(-128~127 缓存生效);但Integer m = 200; n = 200;→m == n是 false
null 安全必须注意
obj == null 是合法、高效、推荐的空判断方式;而 obj.equals("xxx") 在 obj 为 null 时会抛 NullPointerException。
立即学习“Java免费学习笔记(深入)”;
- 安全写法:
if (str != null && str.equals("done")) - 更简洁写法(JDK 7+):
Objects.equals(str, "done"),内部已处理 null - 数据库主键 ID(如 Long 类型)建议统一用 equals(),避免因缓存范围外导致 == 失效
自定义类要用 equals()?先重写它
如果你定义了一个 User 类,两个字段完全相同的对象调用 equals() 默认仍返回 false——因为没重写,它还是在比地址。
- 要让 equals() 有意义,必须重写,并且必须同时重写 hashCode()
- 否则放进 HashMap、HashSet 会出现“明明相等却查不到”或“重复添加”的问题
- 重写时建议用 IDE 自动生成(如 IntelliJ 的 Alt+Insert),或遵循对称性、传递性、一致性等原则


















