2013-12-13 39 views

回答

4

由於Pair支持equals和hashcode,因此可以安全地將其用作關鍵字。

我把一個非常簡單的JUnit測試放在一起,以滿足自己這是真的&它通過。

public final void testPairAsHashMapKey() { 

    HashMap<Pair<Integer, Integer>, String> map = new HashMap<Pair<Integer, Integer>, String>(); 

    Pair<Integer, Integer> p1 = new Pair<Integer, Integer>(0, 0); 
    Pair<Integer, Integer> p2 = new Pair<Integer, Integer>(0, 0); 
    Pair<Integer, Integer> p3 = new Pair<Integer, Integer>(5, 3); 
    Pair<Integer, Integer> p4 = new Pair<Integer, Integer>(3, 5); 

    map.put(p1, "foo"); 
    assertEquals(1, map.size()); 
    assertEquals("foo", map.get(p1)); 

    map.put(p2, "new_foo"); 
    // p2.equals(p1) so map will not grow but value will update 
    assertEquals(1, map.size()); 
    assertEquals("new_foo", map.get(p2)); 

    map.put(p3, "bar"); 
    assertEquals(2, map.size()); 
    assertEquals("bar", map.get(p3)); 

    map.put(p4, "test"); 
    assertEquals(3, map.size()); 
    assertEquals("test", map.get(p4)); 

} 
0

equal方法通過委託給它們各自的equals方法來檢查兩個對象是否相等。

如果你根據你的目的重寫你的對象的equals方法,一切都會好的。 這是一樣的hashCode,但不改變它。默認的hashCode應該沒問題。

+1

你應該總是覆蓋哈希碼,當你覆蓋等於,反之亦然。 _「根據定義,如果兩個對象相等,則它們的哈希碼也必須相等,如果重寫equals()方法,則會改變兩個對象的等同方式,並且Object的hashCode()實現不再有效,如果你重寫equals()方法,你也必須重寫hashCode()方法。「_ –

+0

是的,它是完全正確的,但是如果你的代碼沒有使用hashCode,那沒關係。例如,即使我不重寫hashCode函數,該代碼仍然可以完美運行。 class Test { \t private int i; \t \t public Test(int i){ \t \t this.i = i; \t} \t \t @Override \t公共布爾等於(對象O) \t { \t \t返回this.i ==((試驗)O).I; \t} } 公共類主要{ \t \t 公共靜態無效的主要(字串[] args){ \t \t \t 測試\t T1 =新試驗(1); \t \t Test t2 = new Test(2); \t \t Test t22 = new Test(2); \t \t \t \t System.out.println(t1.equals(t2)); \t \t System.out.println(t2.equals(t22)); \t \t \t \t}} –

+0

你錯了,因爲如果你重寫equals,你應該尊重合同'x1.equals(×2)=>(x1.hashCode()== x2.hashCode())'。 –