Wpis z mikrobloga

Mam pytanie odnośnie metody hashcode(), tak wiem ze zwraca hashcode, ale na internecie znalazłem taką definicje:

hashcode(): a method provided by java.lang.Object that returns an integer representation of the object memory address.

Na SO piszą: The value returned by hashCode() is by no means guaranteed to be the memory address of the object

Jak to z tym w końcu jest? Wiem, że hashcode to jest liczba typu int która odpowiada aktualnemu stanowi obiektu, ja tak to rozumiem, a o co chodzi z tym miejscem w pamięci dla danego obiektu?

#java #programowanie
  • 13
  • Odpowiedz
  • Otrzymuj powiadomienia
    o nowych komentarzach

@must: Tak zachowuje się hashcode w klasie Object. Każda klasa niejawnie dziedziczy po Object, więc jeśli jej nie nadpiszesz, to właśnie tak będzie działać.
  • Odpowiedz
@Ridicz: chodzi mi bardziej o co chodzi z tym object memory adress, skoro jeżeli nadpisujemy metodę to wartość całkowitą wyliczamy mnożąc poszczególne zmienne przez liczby pierwsze.
  • Odpowiedz
@must: to może być object memory address, ale nie musi. wyobraź sobie sytuację, w której dochodzi do kolizji hashy - wówczas fizycznie niemożliwym jest, aby dwa obiekty mieściły się pod tym samym adresem
  • Odpowiedz
@must: > jeżeli nadpisujemy metodę to wartość całkowitą wyliczamy mnożąc poszczególne zmienne przez liczby pierwsze.

No o to właśnie chodzi, jeśli nadpisujemy, to podajemy zasadę, na której ma być wyliczany hashcode w zależności od
stanu obiektu. Jeśli nie, używamy implementacji z klasy Object -> porównujemy adresy w pamięci -> czyli tak naprawdę, sprawdzamy czy dwa porównywane obiekty to jeden i ten sam.
  • Odpowiedz
@Ridicz: dzięki, juz rozumiem! :D Czyli może to być adres, ale nie musi,a jak nie będzie adresem to wtedy domyślna metoda w jaki sposób zwraca tę liczbę? W sensie czym ta liczba jest?
  • Odpowiedz
@must: pogrubiłem ważne

As much as is reasonably practical, the hashCode method defined by class Object does return distinct integers for distinct objects.
(This is typically implemented by converting the internal address of the object into an integer, but this implementation technique is not required by the JavaTM programming language.)

z dokumentacji: https://docs.oracle.com/javase/7/docs/api/java/lang/Object.html#hashCode%28%29
  • Odpowiedz
@must: Docs Tu jest opisany kontrakt.
Ogólnie pisząc hashcode musisz (powinieneś) trzymać się kontraktu. Zapamiętaj, że nie ma domyślnej implementacji tej metody, więc jeśli jej nie nadpiszesz w żadnej klasie, ani nikt inny tego nie zrobił, to użyjesz tej z klasy Object (porównanie adresów).
  • Odpowiedz
wyobraź sobie sytuację, w której dochodzi do kolizji hashy - wówczas fizycznie niemożliwym jest, aby dwa obiekty mieściły się pod tym samym adresem


@kernelpan1c: Tu jest taki drobny kruczek. Domyślna implementacja hashcode gwarantuje że wartość hashcode dla danego obiektu jest niezmienna w czasie. Tak więc może dojść do sytuacji że został wywołany hashcode a jego wartość zapamiętana a następnie garbage collector wykonał ubicia(xD, nie wiem jak przetłumaczyć compacting) pamięci co
  • Odpowiedz