java - 使用 .equals() 和 == 运算符比较两个对象

标签 java class object methods equals

我用一个 String 字段构建了一个类。然后我创建了两个对象,我还必须使用 == 运算符和 .equals() 来比较它们。这是我所做的:

public class MyClass {

    String a;

    public MyClass(String ab) {
        a = ab;
    }

    public boolean equals(Object object2) {
        if(a == object2) { 
            return true;
        }
        else return false;
    }

    public boolean equals2(Object object2) {
        if(a.equals(object2)) {
            return true;
        }
        else return false;
    }



    public static void main(String[] args) {

        MyClass object1 = new MyClass("test");
        MyClass object2 = new MyClass("test");

        object1.equals(object2);
        System.out.println(object1.equals(object2));

        object1.equals2(object2);
        System.out.println(object1.equals2(object2));
    }


}

编译后显示两次 false 作为结果。如果两个对象具有相同的字段 - “测试”,为什么它是假的?

最佳答案

== 比较对象引用,它检查两个操作数是否指向同一个对象(不是等价对象,相同对象)。

如果你想比较字符串(看它们是否包含相同的字符),你需要使用equals来比较字符串。

在您的情况下,如果字符串匹配,则 MyClass 的两个实例确实被认为是相等的,那么:

public boolean equals(Object object2) {
    return object2 instanceof MyClass && a.equals(((MyClass)object2).a);
}

...但通常,如果您正在定义一个类,则等效性不仅仅是单个字段的等效性(在本例中为 a)。


旁注:如果您覆盖 equals,您几乎总是需要覆盖 hashCode .正如它在 equals JavaDoc 中所说的那样:

Note that it is generally necessary to override the hashCode method whenever this method is overridden, so as to maintain the general contract for the hashCode method, which states that equal objects must have equal hash codes.

关于java - 使用 .equals() 和 == 运算符比较两个对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41846927/

相关文章:

java - 测试在 Eclipse 中运行良好,但在 mvn 命令中失败

java - 如何使用自定义 TrustManager 通过 SSL 连接到 POP3 服务器?

javascript - key未知时如何获取js对象的属性值

javascript - 这些数组有什么区别?

java - 仅使用其中两个属性从排序集中查找并删除元素

java - 具有多个接受答案的 JUnit 测试

python - 实例化类时在数据类内部创建时间戳

python - 如何访问不同类的对象?

r - 定义中未定义的插槽类?

java - Java 中的自省(introspection)