Коллекции Java - переопределение equals и hashCode - PullRequest
0 голосов
/ 10 июля 2011
class Hash {
  int a;

  Hash(int h){
    a=h;
  }

  public boolean equals(Object o) {     
    Boolean h=super.equals(o);
    System.out.println("Inside equals ");
    return h;
  }

  public int hashCode() {    
    System.out.println("Inside Hash");    
    return 2;
  }    
}

public class Eq {    
  public static void main(String...r) {    
    HashMap<Hash,Integer> map=new HashMap<Hash,Integer>();    
    Hash j=new Hash(2);    
    map.put(j,1);
    map.put(j,2);
    System.out.println(map.size());
  }
}

вывод был

inside hash

inside hash
1

Поскольку он возвращает тот же хеш-код, при втором добавлении объекта в хэш-карту он должен использовать метод equals, но он не вызывает. Так в чем проблема?

Ответы [ 3 ]

7 голосов
/ 10 июля 2011

HashMap тестирует с == до .equals, и, поскольку вы помещаете один и тот же объект дважды, первый тест проходит.Попробуйте с:

    Hash j=new Hash(2);
    Hash k=new Hash(2);
    map.put(j,1);
    map.put(k,2);
0 голосов
/ 10 июля 2011

Проверка на равенство выполняется HashMap в три этапа:

  1. другой хэш-код => неравный
  2. объекты идентичны (==) => равны
  3. равный метод дает true => равный

Второй шаг предотвращает вызов equals, поскольку идентичные объекты всегда предполагаются равными.

0 голосов
/ 10 июля 2011

Из документа

put (): Связывает указанное значение с указанным ключом на этой карте. Если карта ранее содержала сопоставление для этого ключа, старое значение заменяется.

...