Equals()方法有帮助

时间:2010-09-12 18:42:06

标签: java

我需要为team类编写一个与提供的hashcode方法一致的equals()方法

HashCode方法

 public int hashCode()
   {
      return this.getPro().hashCode() 
             + this.getTeam().hashCode(); 
   }

我的等于方法,但不会工作

public boolean equals(Object obj)
   {
     ClassName pro = (ClassName) obj;
     return (this.getPro().hashCode() == pro.getPro());
             (this.getTeam().hashCode() == pro.getTeam());
   }

任何帮助都会很好

2 个答案:

答案 0 :(得分:3)

在这里,您将哈希码(int)与对象进行比较。另外,你的陈述中间还有一个分号。

你应该试试这个:

@Override
public boolean equals(Object o) {
    if (this == o) return true;
    if (o == null || getClass() != o.getClass()) return false;

    MyClass myClass = (MyClass) o;

    if (!pro.equals(myClass.pro)) return false;
    if (!team.equals(myClass.team)) return false;

    return true;
}

在这里比较对象的内容。


在@Bart K.评论之后,如果团队或专业人士可以为空,那么就可以编写equals()方法:

@Override
public boolean equals(Object o) {
    if (this == o) return true;
    if (o == null || getClass() != o.getClass()) return false;

    MyClass myClass = (MyClass) o;

    if (pro != null ? !pro.equals(myClass.pro) : myClass.pro != null) return false;
    if (team != null ? !team.equals(myClass.team) : myClass.team != null) return false;

    return true;
}

资源:

关于同一主题:

答案 1 :(得分:2)

  1. 两个对象相等的散列并不意味着这两个对象是相等的。
  2. 要检查是否同时满足两个条件,请使用&&
  3. 因此,

    public boolean equals(Object obj)
       {
         ClassName pro = (ClassName) obj;
         return this.getPro() == pro.getPro() && this.getTeam() == pro.getTeam();
       }
    

    但是,您的hashCode()无法生成良好的哈希值,equals()在许多情况下会失败(例如与非ClassNamenull进行比较)。有关如何正确实施它们,请参阅Overriding equals and hashCode in Java。假设没有派生类,请尝试

    @Override public boolean equals(Object obj) {
       if (obj == this) return true;
       if (!(obj instanceof ClassName)) return false;
       ClassName pro = (ClassName)obj;
       <sometype> thisPro = getPro();
       if (thisPro == null || !thisPro.equals(pro.getPro()) return false;
       <sometype> thisTeam = getTeam();
       if (thisTeam == null || !thisTeam.equals(pro.getTeam()) return false;
       return true;
    }