在Java中,equals()与==的不同之处

How equals() different than == in Java

本问题已经有最佳答案,请猛点这里访问。

如我们所知,==比较参考文献,equals()比较内容。但在检查了对象类中的equals()实现之后,我感到困惑。实施是,

1
2
3
public boolean equals(Object obj) {
        return (this == obj);
    }

正如您看到的实现。equals内部调用==运算符。那又有什么不同呢?


它们完全不同,因为您可以覆盖equals(),但不能以任何方式覆盖==

因此,当类作者决定检查两个对象的逻辑相等性时,equals()可以检查两个对象的逻辑相等性,但==总是比较引用,因此只有当两个操作数都是相同的对象(或相同的基元值)时才是真的。


equals()方法比较字符串实例(堆上)中的"value",不管两个对象引用是否引用同一个字符串实例。如果任何两个字符串类型的对象引用引用同一个字符串实例,那么太好了!如果这两个对象引用引用了两个不同的字符串实例。这没什么区别。它是被比较的每个字符串实例中的"值"(即:字符数组的内容)。

另一方面,"=="运算符比较两个对象引用的值,以查看它们是否引用同一个字符串实例。如果两个对象的值引用"引用"同一个字符串实例,那么布尔表达式的结果将是"true"…duh。另一方面,如果两个对象引用的值"引用"不同的字符串实例(即使两个字符串实例具有相同的"值",即每个字符串实例的字符数组的内容相同),则布尔表达式的结果将为"假"。