2017-01-20 10 views
1

모델 클래스에서 equals 메서드를 재정의하고 항상 false를 반환하면 true입니다. 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를 반환합니다. 따라서 값은 두 번 추가되지만 값은 한 번만 추가해야합니다. 아무도 이것을 설명 할 수 있습니까? 내가 봤어 및 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; 
    } 

당신이 코드 줄을 알 경우

당신이 동일한 방법하지만 여전히 (K = e.key를) 재정의하지만
if (e.hash == hash && ((k = e.key) == key || key.equals(k))) 

= = key는 true로 평가되고 이전 항목을 덮어 씁니다.