Jaki default.równa się i.hashCode będzie działał na moich zajęciach?

Say I have my own class

public class MyObj { /* ... */ }

Posiada pewne atrybuty i metody. Nie implementuje equals, nie implementuje hashCode.

Po wywołaniu equals i hashCode, jakie są domyślne implementacje? Z klasy obiektu? A czym oni są? Jak będzie działać domyślna wartość równa? Jak będzie działał domyślny hashCode i co powróci? = = po prostu sprawdzi, czy odnoszą się do tego samego obiektu, więc jest to łatwe, ale co z metodami equals() i hashCode ()?

Author: Ernest Friedman-Hill, 2010-11-14

6 answers

Tak, domyślną implementacją jest Object (ogólnie rzecz biorąc; jeśli dziedziczysz z klasy, która przedefiniowała equals i / lub hashCode, wtedy użyjesz tej implementacji).

Z dokumentacji:

equals

Metoda equals dla obiektu klasy implementuje najbardziej rozróżniającą możliwą relację równoważności na obiektach; to znaczy, dla dowolnych innych niż null wartości odniesienia x i y, metoda ta zwraca true wtedy i tylko wtedy, gdy X i y odnoszą się do ten sam obiekt (X = = y ma wartość true).

hashCode

O ile jest to w miarę praktyczne, metoda hashCode zdefiniowana przez obiekt klasy zwraca różne liczby całkowite dla różnych obiektów. (Zwykle jest to realizowane przez konwersję wewnętrznego adresu obiektu na liczbę całkowitą, ale ta technika implementacji nie jest wymagana przez język programowania JavaTM.)

 98
Author: Etienne de Martel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-09-18 20:24:41

Od Object w jednej z implementacji JVM:

public boolean equals(Object object) {
    return this == object;
}

public int hashCode() {
    return VMMemoryManager.getIdentityHashCode(this);
}

W obu przypadkach to tylko porównanie adresów pamięci danych obiektów.

 52
Author: Brad Mace,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-09-18 20:25:27

Istnieją domyślne implementacje equals() i hashCode() w obiekcie. Jeśli nie dostarczysz własnej implementacji, zostaną one wykorzystane. Dla equals() oznacza to porównanie ==: obiekty będą równe tylko wtedy, gdy są dokładnie tym samym obiektem. Dla hashCode(), Javadoc ma dobre wyjaśnienie.

Aby uzyskać więcej informacji, zobacz Effective Java, Rozdział 3 (pdf), poz. 8.

 10
Author: Jorn,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-11-14 18:48:19

Tak, z Object klasy, ponieważ twoja klasa rozszerza obiekt w sposób niejawny. equals po prostu zwraca this == obj. hashCode implementacja jest natywna. Wystarczy zgadnąć-zwraca wskaźnik do obiektu.

 1
Author: khachik,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-11-14 18:43:54

Jeśli nie podasz własnej implementacji, zostanie użyta jedna pochodząca z obiektu. Jest OK, chyba że planujesz umieścić instancje klasy w np. HashSet (dowolnej kolekcji, która faktycznie używa hashCode ()), lub coś, co wymaga sprawdzenia równości obiektu (np. metody contains () HashSet). W przeciwnym razie zadziała nieprawidłowo, jeśli o to prosisz.

Bardzo łatwo jest zapewnić własną implementację tych metod dzięki HashCodeBuilder i EqualsBuilder from Apache Commons Lang .

 1
Author: Paweł Dyda,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-11-14 19:16:11

IBM ' s developerworks says:

W ramach tej domyślnej implementacji dwa odniesienia są równe tylko wtedy, gdy odnoszą się do dokładnie tego samego obiektu. Podobnie Domyślna implementacja hashCode () dostarczanego przez obiekt jest uzyskany przez mapowanie adresu pamięci obiektu do wartości całkowitej.

Jednak, aby być pewnym dokładnych szczegółów implementacji dla danej wersji Java dostawcy, najlepiej jest szukać jako źródła (jeśli jest dostępne)

 0
Author: brabster,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-11-14 18:42:22