隔江千里
他们是两个完全不同的东西。==比较变量包含的对象引用(如果有)。.equals()检查两个对象是否相等,根据他们的契约来确定平等意味着什么。根据合同,两个不同的对象实例完全可能“相等”。然后有一个小细节,因为equals是一个方法,如果你尝试在引用上调用它null,你会得到一个NullPointerException。例如:class Foo {
private int data;
Foo(int d) {
this.data = d;
}
@Override
public boolean equals(Object other) {
if (other == null || other.getClass() != this.getClass()) {
return false;
}
return ((Foo)other).data == this.data;
}
/* In a real class, you'd override `hashCode` here as well */}Foo f1 = new Foo(5);Foo f2 = new Foo(5);System.out.println(f1 == f2);// outputs false, they're distinct object instancesSystem.out.println(f1.equals(f2));// outputs true, they're "equal" according to their definitionFoo f3 = null;System.out.println(f3 == null);// outputs true, `f3` doesn't have any object reference assigned to itSystem.out.println(f3.equals(null));// Throws a NullPointerException, you can't dereference `f3`, it doesn't refer to anythingSystem.out.println(f1.equals(f3));// Outputs false, since `f1` is a valid instance but `f3` is null,// so one of the first checks inside the `Foo#equals` method will// disallow the equality because it sees that `other` == null