2014-09-05 77 views
0
public class VO { 

    public int hashcode() 
    { 
     return 0; 
    } 
    public boolean equals(Object obj) 
    { 
     return true; 
    } 

    public static void main(String args[]) 
    { 
     VO vo1 = new VO(); 
     VO vo2 = new VO(); 

     Map<VO,Integer> map = new HashMap<VO, Integer>(); 

     map.put(vo1, 1); 
     map.put(vo2, 1); 

     System.out.println(map.size()); 
    } 
} 

我得到的輸出是:2Hashcode方法,等於在Java合同

但按我的知識輸出爲1

當我把一個元素在地圖它將檢查密碼的散列碼,如果該散列碼相同,則它將去檢查等於。如果兩個方法返回相同的值,則它將覆蓋以前的值。

在我的情況下這兩種方法是:(哈希碼和等於)返回0和true.So最後必須有在map.But一個元素在這裏我得到大小爲2

可能是什麼原因。感謝信...

+1

如何添加「覆蓋」? – libik 2014-09-05 09:37:34

+0

@libik覆蓋意味着只有一個值將在那裏終於 – PSR 2014-09-05 09:48:05

回答

10

你不是壓倒性的Object.hashCode,你正在實現自己的hashcode()方法(介意大寫的C)。

一個好的做法是在覆蓋時總是使用@Override註釋。

+0

謝謝你。我現在明白了。 – PSR 2014-09-05 09:38:38

+0

@PSR歡迎您:) – Mena 2014-09-05 09:38:54

+0

它也有助於使用IDE代碼完成,而不是在這種情況下手動鍵入。 – thkala 2014-09-05 09:38:58

1

hashcode()具有小的 「c」)剛剛作爲常規方法,而是對象類方法的hashCode()被調用。

public class VO { 

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

    @Override 
    public boolean equals(Object obj) { 
     return true; 
    } 
} 
+0

@Mena稍遲 – 2014-09-05 09:42:10

+1

即使您沒有放置@ @ Override註解,它仍會覆蓋超類中的同一方法。在這種情況下,問題是他的'hashcode'方法中的字母'c'。假設是'C'。 – lxcky 2014-09-05 09:44:20

+0

@ J.Lucky是的更正 – 2014-09-05 09:46:17