Gdy klasa w Javie nie zastępuje hashCode () , wydrukowanie instancji tej klasy daje niezłą liczbę.
Javadoc Object mówi o hashCode () :
O ile jest to praktycznie możliwe, metoda hashCode zdefiniowana przez klasę Object zwraca różne liczby całkowite dla różnych obiektów.
Ale kiedy klasa zastępuje hashCode () , w jaki sposób mogę uzyskać jej unikalny numer?
Odpowiedzi:
System.identityHashCode (yourObject) poda „oryginalny” kod skrótu yourObject jako liczbę całkowitą. Wyjątkowość niekoniecznie jest gwarantowana. Implementacja Sun JVM da ci wartość związaną z pierwotnym adresem pamięci dla tego obiektu, ale jest to szczegół implementacji i nie powinieneś na nim polegać.
EDYCJA: Odpowiedź zmodyfikowana po komentarzu Toma poniżej re. adresy pamięci i ruchome obiekty.
źródło
System.identityHashCode()
?Jawadoc dla Object określa to
Jeśli klasa zastępuje hashCode, oznacza to, że chce wygenerować określony identyfikator, który (można mieć nadzieję) będzie miał właściwe zachowanie.
Możesz użyć System.identityHashCode, aby uzyskać ten identyfikator dla dowolnej klasy.
źródło
hashCode()
Metoda nie służy do zapewnienia unikalnego identyfikatora obiektu. Raczej przetwarza stan obiektu (tj. Wartości pól członka) na jedną liczbę całkowitą. Ta wartość jest używana głównie przez niektóre struktury danych oparte na haszowaniu, takie jak mapy i zestawy, w celu skutecznego przechowywania i pobierania obiektów.Jeśli potrzebujesz identyfikatora dla swoich obiektów, zalecamy dodanie własnej metody zamiast przesłonięcia
hashCode
. W tym celu możesz utworzyć interfejs podstawowy (lub klasę abstrakcyjną) jak poniżej.Przykładowe użycie:
źródło
Może to szybkie, brudne rozwiązanie zadziała?
Daje to również liczbę instancji zainicjowanej klasy.
źródło
System.identityHashCode
jest lepszym rozwiązaniemAtomicLong
w tej odpowiedzi .Jeśli jest to klasa, którą możesz zmodyfikować, możesz zadeklarować zmienną klasy
static java.util.concurrent.atomic.AtomicInteger nextInstanceId
. (Będziesz musiał podać jej wartość początkową w oczywisty sposób.) Następnie zadeklaruj zmienną instancjiint instanceId = nextInstanceId.getAndIncrement()
.źródło
Wymyśliłem to rozwiązanie, które działa w moim przypadku, w którym mam obiekty utworzone w wielu wątkach i można je serializować:
źródło
Jeśli patrzysz na
hashcode
typy Java podczas wykonywania.toString()
na obiekcie, kod źródłowy jest następujący:źródło
Po prostu w celu rozszerzenia innych odpowiedzi pod innym kątem.
Jeśli chcesz ponownie użyć hash (ów) z „powyżej” i uzyskać nowe, używając niezmiennego stanu swojej klasy, wtedy zadzwoni do super. Chociaż może to / nie kaskadować aż do Object (tj. Niektórzy przodkowie mogą nie wywoływać super), pozwoli ci to uzyskać kody hash poprzez ponowne użycie.
źródło
Istnieje różnica między zwrotami funkcji hashCode () a tożsamością HashCode (). Możliwe jest, że dla dwóch nierównych (przetestowanych ==) obiektów o1, o2 hashCode () może być taki sam. Zobacz poniższy przykład, jak to jest prawdą.
źródło
Miałem ten sam problem i jak dotąd nie byłem zadowolony z żadnej odpowiedzi, ponieważ żadna z nich nie gwarantowała unikatowych identyfikatorów.
Ja też chciałem wydrukować identyfikatory obiektów w celu debugowania. Wiedziałem, że musi być jakiś sposób, aby to zrobić, ponieważ w debuggerze Eclipse określa unikalne identyfikatory dla każdego obiektu.
Wymyśliłem rozwiązanie oparte na fakcie, że operator „==” dla obiektów zwraca wartość true tylko wtedy, gdy dwa obiekty są w rzeczywistości tym samym wystąpieniem.
Uważam, że powinno to zapewnić unikalne identyfikatory przez cały czas trwania programu. Zauważ jednak, że prawdopodobnie nie chcesz tego używać w aplikacji produkcyjnej, ponieważ utrzymuje odniesienia do wszystkich obiektów, dla których generujesz identyfikatory. Oznacza to, że wszelkie obiekty, dla których utworzysz identyfikator, nigdy nie zostaną usunięte.
Ponieważ używam tego do celów debugowania, nie martwię się zbytnio uwalnianiem pamięci.
Możesz to zmodyfikować, aby umożliwić usuwanie obiektów lub usuwanie pojedynczych obiektów, jeśli problemem jest zwolnienie pamięci.
źródło