在java中覆盖equal方法的正确方法是啥?

Posted

技术标签:

【中文标题】在java中覆盖equal方法的正确方法是啥?【英文标题】:What's the correct way to override equal method in java?在java中覆盖equal方法的正确方法是什么? 【发布时间】:2015-05-06 23:09:09 【问题描述】:
public class Person 

    private String name;

    public Person(String name) 
        this.name = name;
    

    public boolean equals(Person p) 
        System.out.println("..............");
        return p.name.equals(this.name);
    

您好,我正在处理 OCJP 问答,这个问题的答案是 equals 方法没有正确覆盖 Object.equlas 方法。

我认为在这里用字符串覆盖是多余的,但是这个问题的答案也不正确。

你能指出我在这里缺少什么概念吗...

注意:对于这个问题,没有选项说用相同的参数覆盖 hasCode 和 equlas...

【问题讨论】:

首先,删除System.out.println.. 你为什么不使用IDE为你生成一个? 提示:尝试使用@Override,您会发现问题所在。 Overriding the java equals() method quirk 的可能重复项 【参考方案1】:

equals 的签名应该是:

public boolean equals(Object p)

您的public boolean equals(Person p) 方法不会覆盖Objectequals。它超载了它。

一种可能的实现方式:

@Override
public boolean equals(Object other)

    if (!(other instanceof Person))
        return false;
    Person p = (Person) other;
    return p.name.equals(this.name);
 

【讨论】:

public boolean equals(Object p)return ((Person)p).name.equals(this.name); 这是正确的签名吧? @RajeshKumar: ClassCastException @RajeshKumar 不完全是。在将p 封装为Person 之前,您应该验证它实际上是一个Person 实例。 @Eran 好的...谢谢。明白了。 @LocHa 如果name 可能为空,您必须测试该场景并返回适当的值,但我假设没有名称的 Person 不是可能的场景(构造函数of Person 应该包含一个可以防止这种情况发生的验证)。【参考方案2】:
@Override
public boolean equals(Object ob) 

    if (!(ob instanceof Person)) 
        return false;
    

    Person p = (Person)ob;

    return p.name.equals(this.name);

ClassCastException 证明 NullPointerException 证明 (Is null check needed before calling instanceof)

【讨论】:

附加我要补充: if (this == obj) return true;如果(obj == null)返回false;如果 (getClass() != obj.getClass()) 返回 false; Persona 其他 = (Person) obj; 有时传递null可能有效

以上是关于在java中覆盖equal方法的正确方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我需要覆盖 Java 中的 equals 和 hashCode 方法?

覆盖 Java 中的 hashCode() 和 equals() 方法

Java 对象 覆盖equals时总要覆盖hashCode

覆盖 django 视图的正确方法是啥

effectiveJava覆盖equals方法

Java:Effective java学习笔记之 覆盖equals时总要覆盖hashcode