2010-09-12 161 views
3

我需要写的队伍类是与提供的hashCode方法equals()方法的帮助

hashCode方法

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

我的equals方法相一致的equals()方法,但不会工作

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

任何帮助将是不错的

+1

您与对象比较哈希码。这是行不通的。你想达到什么目的?你认为hashCode()做什么? – 2010-09-12 18:43:10

+0

如果要将对象放入HashSet或HashMap中,那么两个相等的对象必须返回相同的hashCode,并且返回不同hashCode的两个对象必须不相等。两个不相等的对象可以返回相同的hashCode(例如,有40亿个可能的hashCode,但有更多可能的String)。你不能用hashCode()来定义equals();可能会说两个不平等的东西是平等的。 – 2010-09-12 19:11:08

回答

2
  1. 两个对象的哈希值相等并不意味着这两个对象是相等的。
  2. 要检查两个条件是否都满足,请使用&&

因此,

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; 
} 
+2

我不会使用'=='来比较'equals()'方法中的对象。大部分时间(如果不是总是),如果对象的内容相等,那么对象本身是相等的。 – 2010-09-12 19:00:38

+0

条件(obj == null)是多余的:(null instanceof ClassName)== false – meriton 2010-09-12 19:11:59

+0

@Colin:Oops我假定'=='比较值而不是引用。固定。 – kennytm 2010-09-12 19:12:32

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()方法,如果球队或Pro可以为空的方式:

@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; 
} 

资源:

关于同一主题:

+0

'equals(...)'还应该检查'obj == null'。 – 2010-09-12 18:47:08

+0

这取决于亲和队是否可以空。由于它们似乎不可空(参见OP'hashCode()'),所以它并不是必须的。 – 2010-09-12 18:48:16

+0

不,我并不是说'pro'或'team'是null而是'obj'。例如,'ArrayList '可以包含'null'引用,并且如果对其执行'contains(instanceOfClassName)',则在将'null'与'this'进行比较时,您的实现会抛出NPE。 – 2010-09-12 18:52:29