2011-07-10 52 views
0
class Hash { 
    int a; 

    Hash(int h){ 
    a=h; 
    } 

    public boolean equals(Object o) {  
    Boolean h=super.equals(o); 
    System.out.println("Inside equals "); 
    return h; 
    } 

    public int hashCode() {  
    System.out.println("Inside Hash");  
    return 2; 
    }  
} 

public class Eq {  
    public static void main(String...r) {  
    HashMap<Hash,Integer> map=new HashMap<Hash,Integer>();  
    Hash j=new Hash(2);  
    map.put(j,1); 
    map.put(j,2); 
    System.out.println(map.size()); 
    } 
} 

輸出是Java集合 - 重寫equals和hashCode

 
inside hash 

inside hash 
1 

由於返回相同的散列碼,物體在HashMap中加入所述第二時間它必須使用equals方法但它沒有通話。所以在這裏解決問題?

+2

http://stackoverflow.com/editing-help –

+0

[Overriding equals and hashCode in Java](http://stackoverflow.com/questions/27581/overriding-equals-and-hashcode-in-java) –

回答

-3

From the doc

的put():將指定值與此映射中指定的鍵。 如果映射先前包含該鍵的映射,則替換舊值。

+1

那個沒有解釋有關這個問題的任何... –

+0

「指定密鑰」是散列碼,不是嗎?由於密鑰已在第二次投入時使用,因此不需要檢查是否相等,因此不需要調用equals()。還是我搞砸了? – BlueDog

+0

正確答案是第一個 - 有一個指向hashmap代碼的鏈接。 –

7

HashMap.equals之前==測試,因爲你把相同的對象兩次,第一次測試通過。嘗試用:

Hash j=new Hash(2); 
    Hash k=new Hash(2); 
    map.put(j,1); 
    map.put(k,2); 
+2

[相關代碼](http://www.docjar.com/html/api/java/util/HashMap.java.html)在393行 –

+0

多數民衆贊成合理:)現在我很清楚 – Prabhu

0

所述相等性檢查是通過HashMap的三個步驟來完成:

  1. 哈希碼是不同=>不等
  2. 對象相同(==)=>等於
  3. 等於

第二步防止調用equals,因爲相同的對象是假設平等。

相關問題