2017-01-20 2 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 i.e e1.equals(e1) возвращает false. поэтому значения должны быть добавлены дважды, но только добавлены. Может кто-нибудь объяснить это. Я googled и очистил мою концепцию на HashCode и равный контракт, но здесь я терплю неудачу.

+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; 
    } 

, если вы заметили эту строку кода

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

хотя вы переопределены равный метод, но до сих пор (к = e.key) = = key оценивает значение true и перезаписывает старую запись.