答案:==比较引用地址,equals()比较内容。对于对象,==判断是否同一实例,equals()需重写以比较逻辑相等;基本类型只能用==;String、Integer等类重写equals()实现内容比较;自定义类需重写equals()和hashCode()确保正确比较。

在Java中,== 和 equals() 都可以用来比较两个值是否相等,但它们的作用机制完全不同。理解它们的区别对正确处理对象比较至关重要。
== 比较的是引用地址
对于对象类型(如 String、Integer、自定义类等),== 判断的是两个变量是否指向堆内存中的同一个对象,也就是比较它们的引用地址是否相同。
例如:
String str1 = new String("hello");String str2 = new String("hello");
System.out.println(str1 == str2); // 输出 false,因为是两个不同的对象实例
即使内容相同,只要不是同一个对象,== 就返回 false。
立即学习“Java免费学习笔记(深入)”;
equals() 比较的是对象内容
equals() 是 Object 类的方法,设计初衷是用来比较两个对象的“逻辑相等性”。默认实现也是比较引用(和 == 一样),但很多类(如 String、Integer 等)都重写了这个方法,改为比较实际内容。
继续上面的例子:
System.out.println(str1.equals(str2)); // 输出 true,因为字符串内容相同String 类重写了 equals(),逐字符比较内容,所以结果为 true。
基本类型只能用 ==
对于 int、char、boolean 等基本数据类型,没有 equals() 方法,只能使用 == 来比较值。
int a = 5;int b = 5;
System.out.println(a == b); // 输出 true,比较的是数值
注意:包装类型(如 Integer)使用 == 时要小心,因为在 -128 到 127 范围内会缓存对象,可能导致意外的 true 结果。
自定义类如何正确使用 equals
如果你创建了一个类,并希望按内容比较对象,必须重写 equals() 方法(通常还要重写 hashCode())。
例如:
public class Person {private String name;
public Person(String name) { this.name = name; }
@Override
public boolean equals(Object obj) {
if (this == obj) return true;
if (!(obj instanceof Person)) return false;
Person other = (Person) obj;
return name != null ? name.equals(other.name) : other.name == null;
}
}
这样 new Person("Tom") 和另一个 new Person("Tom") 使用 equals 才会返回 true。
基本上就这些。记住:== 看“是不是同一个对象”,equals() 看“内容是否一样”,而且需要类自己支持。不复杂但容易忽略。










