Trzeba prawidłowo przesłonić metodę equals() z klasy Object
Edit: Myślę, że moja pierwsza reakcja była źle prawdopodobnie dlatego, że nie było zbyt precyzyjne. Postanowiłem więc dodać więcej wyjaśnień.
Dlaczego trzeba zastąpić equals()? Cóż, ponieważ to jest w domenie dewelopera, aby zdecydować, co to znaczy, że dwa obiekty są równe. Równość referencyjna nie wystarcza w większości przypadków.
Na przykład wyobraź sobie, że masz HashMap, którego klucze są typu Person. Każda osoba ma imię i adres. Teraz chcesz znaleźć szczegółową fasolę za pomocą klucza. Problem polega na tym, że zazwyczaj nie można utworzyć instancji z takim samym odniesieniem, jak ten na mapie. To, co robisz, to stworzyć kolejną instancję klasy Osoba. Oczywiście, operator == nie będzie działał tutaj i musisz użyć equals().
Ale teraz dochodzimy do innego problemu. Wyobraźmy sobie, że twoja kolekcja jest bardzo duża i chcesz przeprowadzić wyszukiwanie. Naiwna implementacja porównałaby twój kluczowy obiekt z każdą instancją na mapie za pomocą equals(). To jednak byłoby bardzo ekspansywne. I tu pojawia się hashCode(). Jak zauważyli inni, hashcode to jedna liczba, która nie musi być unikalna. Ważnym wymogiem jest to, że gdy equals() daje true dla dwóch obiektów, hashCode() musi zwrócić tę samą wartość dla obu z nich. Odwrotna implikacja nie zachodzi, co jest dobre, ponieważ hashcode oddziela nasze klucze na rodzaj wiader. Mamy niewielką liczbę instancji klasy Osoba w pojedynczym wiadrze. Kiedy przeprowadzamy wyszukiwanie, algorytm może od razu przejść do poprawnego zasobnika i dopiero teraz wykonać równe dla każdej instancji. Dlatego implementacja dla hashCode() musi rozdzielać obiekty tak równomiernie, jak to tylko możliwe, między segmentami.
Jest jeszcze jeden punkt. Niektóre kolekcje wymagają prawidłowej implementacji metody hashCode() w klasach, które są używane jako klucze nie tylko ze względu na wydajność. Oto przykłady: HashSet i LinkedHashSet. Jeśli nie przesłonią hashCode(), domyślna metoda hashCode() obiektu pozwoli wielu obiektom, które można uznać za "znaczące", aby zostały dodane do zestawu "nie można duplikatów".
Część zbiorów, które korzystają hashCode()
- Hashset
- LinkedHashSet
- HashMap
spojrzeć na tych dwóch klas z Apache Commons, które pozwalają na wdrożenie equals() i hashCode() łatwo
Zrobiłem Google to, ale wszystkie przykłady, które znalazłem nigdy nie wyjaśniały, że musiałaś zastąpić metodę równości. –
@AndroidAddict: Dlaczego więc nie zadałeś tego pytania? –