Powiedz, że mam własną klasę
public class MyObj { /* ... */ }
Ma pewne atrybuty i metody. NIE implementuje equals, NIE implementuje hashCode.
Kiedy wywołamy equals i hashCode, jakie są domyślne implementacje? Z klasy Object? A czym one są? Jak będzie działać domyślna równość? Jak będzie działał domyślny hashCode i co zwróci? == po prostu sprawdzi, czy odwołują się do tego samego obiektu, więc jest to łatwe, ale co z metodami equals () i hashCode ()?
v6u23 ea
:public native int hashCode();
Istnieją domyślne implementacje
equals()
ihashCode()
w Object. Jeśli nie podasz własnej implementacji, zostaną one użyte. Dlaequals()
, oznacza to==
porównania: obiekty będą równe tylko wtedy, gdy są one dokładnie tego samego obiektu. DlahashCode()
The Javadoc ma dobre wytłumaczenie.Aby uzyskać więcej informacji, patrz Efektywna Java, Rozdział 3 (pdf), punkt 8.
źródło
Tak, z
Object
klasy, ponieważ Twoja klasa niejawnie rozszerza Object.equals
po prostu wracathis == obj
.hashCode
implementacja jest natywna. Zgaduję - zwraca wskaźnik do obiektu.źródło
Jeśli nie podasz własnej implementacji, zostanie użyta implementacja pochodząca z Object. To jest OK, chyba że planujesz umieścić swoje instancje klasy w np. HashSet (dowolnej kolekcji, która faktycznie używa hashCode ()), lub czymś, co musi sprawdzić równość obiektu (np. Metoda zawiera () HashSet). W przeciwnym razie będzie działać nieprawidłowo, jeśli o to prosisz.
Zapewnienie własnej implementacji tych metod jest dość łatwe dzięki HashCodeBuilder i EqualsBuilder z Apache Commons Lang .
źródło
Foo
iBar
są odwołaniami do dwóch różnych instancji typu mutowalnego i istnieje metoda (np.SomeMutatingMethod
) Taka,Foo.SomeMutatingMethod()
która nie wpływa wBar
ten sam sposóbFoo
, różnica ta powinna wystarczyć, aby uznać obiekty za nierówne.Dział deweloperów IBM mówi:
Jednak, aby mieć pewność co do dokładnych szczegółów implementacji dla wersji Java konkretnego dostawcy, prawdopodobnie najlepiej będzie wyglądać jak źródło (jeśli jest dostępne)
źródło