2017-01-20 12 views
1

モデルクラスのequalsメソッドをオーバーライドして常にfalseを返すとします。 hashCodeは常に定数値を返します。私がオブジェクトを作成してそれを追加すると、HashSet/HashMApが重複を検出する方法を設定しますか?EqualsとHashMap/HashSet

public class Employee { 

    int id; 
    String name; 
    @Override 
    equals(){ 
    return false; 
     } 
    } 

     public static void main(String[] args) { 

      HashMap<Employee,String> hk= new HashMap<Employee,String>(); 
      Employee e1 = new Employee(); 
      e1.setId(18); 
      e1.setName("roohi"); 
      hk.put(e1, "hello"); 
      hk.put(e1, "hello"); 
      } 

Equalsメソッドがfalseを返す場合、つまりe1.equals(e1)がfalseを返す場合。値は2回追加されますが、追加される値は1つだけです。誰でもこれを説明できますか?私はグーグルで、私のコンセプトをHashCodeでクリアして契約と同じだが、ここでは失敗している。あなたが近くに取る場合は、コード

if (e.hash == hash && ((k = e.key) == key || key.equals(k))) 

のこのラインを気づけば

+0

これは、すべて同じバケット内の別々のエントリになります。 –

答えて

1

Map.put方法に

public V put(K key, V value) { 
     if (table == EMPTY_TABLE) { 
      inflateTable(threshold); 
     } 
     if (key == null) 
      return putForNullKey(value); 
     int hash = hash(key); 
     int i = indexFor(hash, table.length); 
     for (Entry<K,V> e = table[i]; e != null; e = e.next) { 
      Object k; 
      if (e.hash == hash && ((k = e.key) == key || key.equals(k))) { 
       V oldValue = e.value; 
       e.value = value; 
       e.recordAccess(this); 
       return oldValue; 
      } 
     } 

     modCount++; 
     addEntry(hash, key, value, i); 
     return null; 
    } 

を見て、あなたは同じ方法が、それでも(= e.key k)をオーバーライドしているものの= = keyはtrueに評価され、古いエントリを上書きします。