2017-05-11 7 views
1
import java.util.HashMap; 
import java.util.Map; 

public class MapTest { 
    public String id; 
    public String getId() { 
     return id; 
    } 
    public void setId(String id) { 
     this.id = id; 
    } 
    @Override 
    public int hashCode(){ 
     return 100; 
    } 
    @Override 
    public boolean equals(Object te){ 
     return false; 
    } 
    public static void main(String[] args) { 
     MapTest obj = new MapTest(); 
     MapTest obj1 = new MapTest(); 
     obj.setId("test"); 
     obj1.setId("test2"); 
     Map<MapTest,Integer> test = new HashMap<MapTest,Integer>(); 
     test.put(obj, 1000); 
     test.put(obj1, 2000); 
     test.put(new MapTest(), 4000); 
     System.out.println(test.get(obj)); //1000 
     System.out.println(test.get(obj1));//2000 
     System.out.println(test.get(new MapTest()));//Null 
     System.out.println(test.size());//3 
    } 

} 

ここでは、オブジェクトはHashMapにデータを追加する際に上書きされないようにインラインで同じハッシュコードを返すため、falseを返すequalsメソッドがあります。今私が私は適切なデータの例obj1を取得し、正確な値を与えてobjを得るが、私の質問は、両方のハッシュコードは、Javaが異なるオブジェクトを区別し、hashmapから正確な値を返す方法は同じです。オーバーライドメソッドは、HashMapに挿入中にfalseを返すメソッド

答えて

1

答えは、HashMapがgetメソッドをどのように実装しているかです。指定されたキーがマップに格納されているキーと等しいかどうかをチェックすると(等しいハッシュコード値を持つ場合)、まず参照平等チェックが実行されます。以下のコードは、Java 8のgetの実装から取られています。ご覧のとおり、鍵のチェックは==です。あなたは同じid値を、別のオブジェクトを使用している場合は、あなたのオブジェクトに定義された構造的な平等がないよう

if (e.hash == hash && 
    ((k = e.key) == key || (key != null && key.equals(k)))) 
     return e; 

、それは、動作しません。これを試してみてください:

TestMap obj2 = new TestMap(); 
obj2.setId("test"); 
System.out.println(test.get(obj2)); // Returns Null 
1

ハッシュコードが等しくなることは最初の二つのキーと同じかどうかを決定するハッシュマップのための要件が​​、

1/

だけではなく、(KEY1 KEY2 == || key1.equals(KEY2)であります)も必要です。

equalsメソッドを常にtrueに変更すると、最後に地図に要素が1つしかないことがわかります。

関連する問題