2017-01-20 2 views
1

si je remplace la méthode equals dans la classe de modèle et renvoie toujours false. et le hashCode renvoie toujours une valeur constante. si je crée un objet et l'ajoute à Définir comment HashSet/HashMAp détecte les doublons?Equals et 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"); 
      } 

si la méthode Equals renvoie false i.e e1.equals(e1) renvoie la valeur false. donc les valeurs devraient être ajoutées deux fois mais seulement sa ajoutée. Quelqu'un peut-il s'il vous plaît expliquer cela. J'ai googlé et effacé mon concept sur HashCode et équivaut à contrat mais ici je suis défaillant.

+0

Ce ne sera pas, ce sera toutes les entrées séparées (dans le même compartiment) –

Répondre

1

Si vous prenez regarder de près la méthode 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; 
    } 

si vous remarquez cette ligne de code

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

si vous avez remplacé la méthode égale, mais encore (k = e.key) = = key évalue à true et remplace l'ancienne entrée.