2011-07-10 9 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()); 
    } 
} 

出力は、同じハッシュコードを返すので、オブジェクトはハッシュマップに追加された第二の時間が、それはequalsメソッドを使用しなければならないJavaコレクション - オーバーライド等しいとhashCode

 
inside hash 

inside hash 
1 

ましたそれは電話しません。だからここに問題がある?

+2

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

+0

[JavaでのequalsおよびhashCodeのオーバーライド](http://stackoverflow.com/questions/27581/overriding-equals-and-hashcode-in-java) –

答えて

-3

From the doc

PUT():このマップ内の指定されたキーに指定された値を関連付けます。 以前マップにこのキーのマッピングが含まれていた場合は、古い値が置き換えられます。

+1

質問について何も説明していません... –

+0

"指定されたキー"はハッシュコードですか? 2番目のputの時点でキーがすでに使用されているので、equals()の呼び出しがないので、equalsをチェックする必要はありません。または私はそれを台無しにしましたか? – BlueDog

+0

正解は最初のものです - ハッシュマップコードへのリンクがあります。 –

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

thats合理的:)今私は明らかです – Prabhu

0

等価性チェックは、3つのステップでハッシュマップすることによって行われる。

  1. ハッシュコード異なる=>不等
  2. オブジェクトが同一(==)=>等しい
  3. あります等しい方法は、真=>等しさを与える。

第2のステップは、同一のオブジェクトが同じオブジェクトであるため、equalsを呼び出すのを防ぎます。いつも等しいとみなされる。

関連する問題