2012-05-25 27 views
1

我有以下兩個類,並且想要使用Foo1作爲HashMap中的鍵。兩個Foo1對象如果它們的Foo2對象相等,則對象相等,如果它們的字節數組滿足Arrays.equals(),則對象相等。在HashMap中使用的對象數組的hashCode()

我不是很確定方法爲Foo1做什麼。我是否需要總結其每個Foo2對象的哈希碼,還是這樣效率低下?

public class Foo1 { 

    Foo2[] foo2_array; 

    @Override 
    public boolean equals(Object Other) { 

    for (int i = 0; i < foo2_array.length; i++) { 

     if (!foo2_array[i].equals(other.foo2_array[i]) 
      return false; 
    } 

    return true; 
    } 

    @Override 
    public int hashCode() { 

     // what to here? 
    } 
} 

public class Foo2 { 

    byte[] values; 

    @Override 
    public boolean equals(Object other) { 

     return Arrays.equals(values, other.values); 
    } 

    @Override 
    public int hashCode() { 

    return Arrays.hashCode(values); 
    } 
} 
+0

如何你的Foo1邏輯與Foo2不同?在這兩種情況下,您都希望每個對象的數組字段在組件方面相等。爲什麼不在這兩種情況下使用Arrays.equals/Arrays.hashCode? (順便說一句,沒有一些投射,Foo2將無法編譯) –

回答

4

hashcode應使用同一組屬性爲equals它不撕毀合同。

只需使用Arrays.hashcode作爲Foo2

而且你不通過每個元素都在循環您等於你可以使用Arrays.equals

foo2的等於可以像這樣類似Foo1.equals

完成
@Override 
    public boolean equals(Object obj) { 
     if (this == obj) 
      return true; 
     if (obj == null) 
      return false; 
     if (getClass() != obj.getClass()) 
      return false; 
     Foo1 other = (Foo1) obj; 
     if (!Arrays.equals(foo2_array, other.foo2_array)) 
      return false; 
     return true; 
    } 

和hashCode類似Foo1哈希碼

​​

另外,當實現equals時,請檢查null的相同引用和對象有效性。

0

你基本上需要有一些方法,使不同的對象可能有不同的散列碼。

所以這取決於你的數據,你不一定需要總結的哈希所有數組中的項目。你基本上需要一些「足夠好的東西來縮小東西」。

我會這樣說的:有沒有關於您的數據的任何信息,讓您懷疑您不能僅僅採取數組中間值的哈希碼?或者,例如,第一個,最後一個和中間項目的組合散列碼?

(事情,會讓你懷疑你不能做到這一點:如果說,你的數據有一些特殊的功能,使值的一定的極小部分出現的數組中的中間元素)