使用 .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));
    }

}

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

原文由 Fastkowy 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 479
2 个回答

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

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

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

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

…但是通常,如果您要定义一个类,则等效性不仅仅是单个字段的等效性(在这种情况下为 a )。


旁注:如果您覆盖 equals ,您几乎总是需要覆盖 hashCode 。正如 equals JavaDoc 中所说:

需要注意的是,当这个方法被重写时,一般需要重写 hashCode 方法,以维护 hashCode 方法的一般契约,它声明相等的对象必须具有相等的哈希代码。

原文由 T.J. Crowder 发布,翻译遵循 CC BY-SA 3.0 许可协议

你应该覆盖等于

 public boolean equals (Object obj) {
     if (this==obj) return true;
     if (this == null) return false;
     if (this.getClass() != obj.getClass()) return false;
     // Class name is Employ & have lastname
     Employe emp = (Employee) obj ;
     return this.lastname.equals(emp.getlastname());
 }

原文由 user5119219 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题