2016-09-19 2 views
0

これまでは、ハッシュマップ内部の作業について非常に明確でした。しかし、以下のコードスニペットを見ると少し混乱します。ハッシュマップの出力

次のコードでは、私のクラスのequals()メソッドは常にfalseを返します。したがって、私はHashMap.get()からと決してそのクラスの鍵を見つけることが期待されます。

誰かが私を説明できますか?私が知っているgetメソッドでは、ハッシュコードを計算し、正確なバケットを見つけるでしょうが、equalsがfalseを返しているので、3を返すことができますか?

package com.vikash.Theory.CollectionsFramework; 

    public class Emp { 

     private String firstName; 
     private String lastName; 

     public Emp(String firstName,String lastName) { 
      this.firstName=firstName; 
      this.lastName=lastName; 
     } 

     public String getFirstName() { 
      return firstName; 
     } 

     public void setFirstName(String firstName) { 
      this.firstName = firstName; 
     } 

     public String getLastName() { 
      return lastName; 
     } 

     public void setLastName(String lastName) { 
      this.lastName = lastName; 
     } 

     public int hashCode() { 
      return firstName.hashCode()+lastName.hashCode(); 
     } 

     public boolean equals(Object o) { 
      return false; 
     } 
    } 


public class Test { 

    public static void main(String[] args) { 

     Map<Object,Integer> map=new HashMap<Object,Integer>(); 
     Emp e1=new Emp("Vikash","Mishra"); 
     Emp e2=new Emp("Mishra","Vikash"); 
     Emp e3=new Emp("Mishra","Vikash"); 
     map.put(e1, 1); 
     map.put(e2, 2); 
     map.put(e3, 3); 
     /*e2.setFirstName("Vikash"); 
     e2.setLastName("Mishra");*/ 
     System.out.println("Size of the map is:"+map.size()); 
     System.out.println(map.get(e3)); } } 
+0

ヒント:**ハッシュ**マップ –

+0

3つの非等価キーを入力しているので、3を返しています...何を返すと思いますか、なぜですか? –

+1

彼のポイントは、 'equals()'は常に 'false'を返すので、' get() 'がnullを返すと期待します。 – slim

答えて

2

のHashMapのソースコードは、すべてを明らかに:

322  if (e.hash == hash && ((k = e.key) == key || key.equals(k))) 
323     return e.value; 

それはkey.equals(e.key)をテスト前に、それはe.key == keyをテストします。 Javaで紛らわしい行動のすべての種類を引き起こし、それがそうすることを避けるために非常に賢明ですequals()バギーを持つ一般的に

、。 equals()契約の一部は、x.equals(x)が常にtrueである必要があります。あなたのハッシュコードで

+0

は、結果の実装依存で説明した後、私は今、答えを得たunderstood.But何それ? –

+0

私は実装が==テストを行うべきだという標準はないと思います。 – slim

+0

PM77-1 @契約破りのコードの結果は常に_unspecified_と、実装依存性を意味し、他のものの間です。 –

-2

1)()あなたはEMPクラスの等号()メソッド

2を使用していない)の代わりに、あなたのハッシュコード()、姓と名がでているので、Stringクラスのすでに実装ハッシュコードを()を使用していますタイプ文字列。

3)お使いの場合には両方のキーが同じであっても、彼らは(異なるハッシュコードを持つことになりますが) あなたはキーが同じになるとき、彼らは(同じハッシュコードを持つべきであると定義していないbeacuse)

4)(等しいです)メソッドは、(ハッシュコードで呼び出されていない)自動的ではなく、それは(ハッシュコードを実装するために、明示的に呼び出す必要があります)、最終的に

所望の方法でハッシュマップは、これは私が正常に動作している理由かもしれないしてください何を考えていますあなたがバグのあるequals()メソッドを持っている場合でも

関連する問題