2012-02-07 65 views
0

我有一个类正确实施的hashCode /等于

class Pair<T>{ 
    private T data; 
    private T alternative; 
} 

两对的对象是,如果

this.data.equals(that.data) && this.alternative.equals(that.alternative) || 
this.data.equals(that.alternative) && this.alternative.equals(that.data) 

我有困难,但正确实施的hashCode()部分相等。任何建议,将不胜感激

回答

1

这应该做的伎俩:

@Override 
    public int hashCode() { 
    return data.hashCode() * alternative.hashCode(); 
    } 

既然你要包括两个字段成等号,你需要包含两个字段到hashCode方法。如果不相等的对象最终具有相同的哈希代码是正确的,但根据您的方案相同的对象总是最终具有与此方法相同的哈希代码。

2

您应该使用的数据和替代哈希码是这样的:

return this.data.hashCode() + this.alterative.hashCode(); 

虽然不是最好的方法,因为如果你改变数据或选择,那么他们的哈希码也将发生变化。想一想,看看你是否真的需要使用这个类作为地图中的关键字,如果不是Long或String将是更好的选择。

0

参考Java文档,hashCode的一般合同(从Java文档复制):

- Whenever it is invoked on the same object more than once during an 
    execution of a Java application, the hashCode method must 
    consistently return the same integer, provided no information used in 
    equals comparisons on the object is modified. This integer need not 
    remain consistent from one execution of an application to another 
    execution of the same application. 



- If two objects are equal according to the equals(Object) method, then 
    calling the hashCode method on each of the two objects must produce 
    the same integer result. 



- It is not required that if two objects are unequal according to the 
    equals(java.lang.Object) method, then calling the hashCode method on 
    each of the two objects must produce distinct integer results. 
    However, the programmer should be aware that producing distinct 
    integer results for unequal objects may improve the performance of 
    hashtables. 

所以从您的实现平等的,数据和替代切换使用。因此,如果切换data.hashCode()和alternative.hashCode()的位置,则需要确保在您的hashCode实现中返回相同的值。如果您不确定,只需返回一个常量值,例如1(但是,当您尝试将对象放入地图时,可能会导致性能问题)。