java中的equals()和运算符“==”

时间:2011-05-01 12:35:13

标签: java equals

我知道equals()将比较对象的值,'=='运算符将检查变量是否指向同一个内存。

我不明白equals()如何比较对象的价值,例如:

class Test {
    public Test(int x, float y) {
        this.x = x;
        this.y = y;
    }

    int x,
    float y;
}

Test test1 = new Test(1,2.0);
Test test2 = new Test(1,2.0);

因此,如果我使用equals(),它会比较每个对象中的每个属性吗?

如果我们谈论String怎么样?使用equals()和operator“==”,我们还需要覆盖equals()吗?

3 个答案:

答案 0 :(得分:20)

不,如果您没有覆盖班级中的equals - 方法,则equals==相同。请参阅documentation

  

类Object的equals方法   实现最具辨别力的   可能的等价关系   对象;也就是说,对于任何非null   参考值x和y,这种方法   当且仅当x和y返回true   引用同一个对象(x == y有   值true)。

文档还说明了equals方法的要求,以防您想要实现它。

答案 1 :(得分:11)

除非您根据Joshua Bloch规定的规则正确地重载它。

默认行为使用==检查引用的相等性。

为您的对象覆盖equals hashCode非常重要,尤其是当您打算在java.util.Collections中使用它们时。

答案 2 :(得分:0)

equals方法在Object类中定义,并且由于Java中的所有对象都隐式或显式地从此类继承,因此它们也将继承Object实现的equals()方法。如果对象通过“==”条件,Object中的默认实现将返回true。

但是,您可以自由地覆盖自己类中的equals()方法,并指定必须检查的条件以查看两个对象是否有意义相等。例如,您可能会说两个实例只有在每个属性包含与另一个对象相同的值时才相等,或者您可能只想检查组成对象“业务键”的一些属性而忽略其他属性。

String类的相等遵循与Java中任何其他类相同的规则;如果“==”确实引用相同的实例,则它们将为true,如果它们包含相同的值,则equals()将为true。