2012-02-07 89 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(但是,當您嘗試將對象放入地圖時,可能會導致性能問題)。