2016-02-05 38 views
3

我,因爲我以爲HashMap和Hashtable的行爲應該同樣的方式,當涉及到的hashCode和equals方法有點困惑。在下面的這個例子中,我的關鍵類已經重寫equals方法來總是返回false。不同的行爲爲HashMap和Hashtable的當等於重寫總是返回False

沒有任何一個有可以在這種行爲差異解釋的任何想法,因爲它看起來像輸出是兩個

null值不同

null值

值值1

值Value 2

import java.util.Hashtable; 
import java.util.HashMap; 

public class HashTest { 

    public static void main(String[] args) { 

     Hashtable ht = new Hashtable(); 
     HashMap hm = new HashMap(); 
     KeyClass k1 = new KeyClass("k1"); 
     KeyClass k2 = new KeyClass("k2"); 

     ht.put(k1, "Value 1"); 
     ht.put(k2, "Value 2"); 
     hm.put(k1, "Value 1"); 
     hm.put(k2, "Value 2"); 

     System.out.println("value " + ht.get(k1)); 
     System.out.println("value " + ht.get(k2)); 

     System.out.println("value " + hm.get(k1)); 
     System.out.println("value " + hm.get(k2)); 
    } 
} 

class KeyClass { 
    String key; 

    public KeyClass(String str) { 
     key = str; 
    } 

    @Override 
    public int hashCode() { 
     return 2; 
    } 

    @Override 
    public boolean equals(Object obj) { 
     return false; 
    } 
} 
+1

總是返回'equals'方法的對象'FALSE'是無效的,因爲它不符合「equals」的合約。 [上有'hashCode'的實現約束和'equals'方法](http://stackoverflow.com/questions/27581/what-issues-should-be-considered-when-overriding-equals-and-hashcode -in-JAVA) – Raedwald

+0

'==和equals()不是same' – Shark

回答

7

This是因爲HashMap第一次使用==在平等檢查:

public V get(Object key) { 
    //... 
    if (e.hash == hash && ((k = e.key) == key || key.equals(k))) 
     return e.value; 

所以,儘管equals()返回false,同一個對象作爲相同的密鑰處理。

+2

你違反了[反思](http://docs.oracle.com/javase/8/docs/api/java/lang/Object .html#equals-java.lang.Object-)需要'equals()'。 – biziclop

+1

@biziclop是的,這個例子中完美展現了違反合同的後果:不可預知的行爲。 –

+0

@Sasha Salauyou感謝。這解釋了它。 – abhijit

0

返回始終爲false在等於是不是一個好主意。根據定義equals需要自反:

自反性:對於任何非空的參考值x,x.equals(x)的 應返回true。

對於哈希表將返回null,因爲它使用等於當哈希碼等於而哈希表將檢查==爲第一