==比较引用是否指向同一对象,equals比较内容是否相等(需类重写);字符串字面量、intern()及同一实例赋值时==为true,new创建的对象地址不同故==为false。

Java里比较引用类型,==看的是两个变量是不是指向堆内存里的同一个对象,也就是地址是否相同;equals看的是对象“长什么样”,也就是内容是否一致——但前提是这个类重写了equals方法。
什么时候 == 会返回 true?
只有当两个引用变量实际指向同一个对象实例时,==才为true。常见情况包括:
- 字符串字面量直接赋值:
String a = "ok"; String b = "ok";→a == b是true(JVM把相同字面量放进常量池,复用同一对象) - 显式调用
intern():new String("ok").intern() == "ok"→true - 同一个对象被多次赋值:
String s = "test"; String t = s;→s == t是true
为什么 new 出来的字符串 == 不成立?
new String("abc") 总是在堆上创建新对象,哪怕内容完全一样,地址也不同。所以:
-
new String("abc") == new String("abc")→false -
new String("abc").equals(new String("abc"))→true(String类重写了equals,逐字符比对)
equals 不是万能的,得看类有没有重写
equals 的行为取决于具体类的实现:
-
String、Integer、ArrayList等都重写了equals,按内容或结构逻辑判断相等 - 你自己写的类,如果不重写
equals,它就继承Object的默认实现,效果和==一样——还是比地址 - 重写
equals时,必须同步重写hashCode,否则在HashMap、HashSet中可能出问题
安全写法推荐
日常开发中,判断内容是否相等,优先用以下方式:
- 字符串比较:用
"abc".equals(str)(避免str为null时抛空指针) - 通用对象比较:用
Objects.equals(a, b)(自动处理null) - 绝对不要用
==判断两个new出来的对象内容是否相同











