2010-09-17 14 views
10

Jestem ciekaw dlaczego Object.toString() powraca w ten sposób:Dlaczego domyślna Object.toString() zwraca reprezentację szesnastkową hashCode?

return getClass().getName() + "@" + Integer.toHexString(hashCode()); 

W przeciwieństwie do tego:

return getClass().getName() + "@" + hashCode(); 

Jakie korzyści daje wyświetlając kod skrótu jako hex zamiast dziesiętny kupić ci?

+0

Ściśle związane z http://stackoverflow.com/questions/29140402/how-do-i-print-my-java-object-without-getting-sometype2f92e0f4 – Raedwald

Odpowiedz

9

Object.hashCode używane do obliczenia based on a memory location where the object is located. Miejsca w pamięci są prawie zawsze wyświetlane jako szesnastkowe.

Domyślna wartość zwracana toString nie jest tak bardzo zainteresowana kodem mieszania, ale raczej w celu jednoznacznej identyfikacji obiektu w celu debugowania, a kod skrótu służy również do celów identyfikacji (w rzeczywistości kombinacja nazwy klasy + adresu pamięci jest naprawdę wyjątkowa i chociaż nie jest gwarantowany unikalny kod skrótu, często jest blisko).

+12

ściśle mówiąc 'Object.hashCode()', zwraca liczba, która * dla niektórych maszyn JVM * jest oparta na lokalizacji obiektu * w momencie, gdy metoda zostanie po raz pierwszy wywołana *. GC może przenieść obiekt, ale 'hashCode' musi pozostać taki sam. –

+4

Czy rzeczywiście istnieją ** dowolne JVM, dla których zwraca lokalizację pamięci? – Raedwald

+3

Oświadczenie, że "' Object.hashCode "domyślnie zwraca adres pamięci" jest błędne dla wszystkich maszyn JVM Sun/Oracle wydanych w ciągu ostatniej dekady, c.f. http://stackoverflow.com/questions/16105420/java-object-hashcode-address-or-random/16105878#16105878. Czy brałeś pod uwagę inne implementacje JVM, czy też chciałeś powiedzieć, że hashCode ** użyty do ** zwrócenia lokalizacji pamięci? – meriton

9

Nie podoba mi się zaakceptowana odpowiedź. Oto moja odpowiedź.

Krótka odpowiedź: ponieważ hex jest łatwiejszy do zapamiętania, ponieważ liczba wyrażona w heksach jest krótsza i ma większą różnorodność znaków niż ta sama liczba wyrażona w systemie dziesiętnym.

Dłuższa odpowiedź: Nie będziesz używać kodu skrótu do robienia arytmetyki przy pomocy swojej głowy, więc nie musisz podawać go w systemie dziesiętnym. Z drugiej strony bardzo prawdopodobne jest, że będziesz go używał w jedyny sposób, w jaki ma być używany, to znaczy, czy dwa kody skrótu odnoszą się do tego samego obiektu lub do różnych obiektów. Innymi słowy, użyjesz go jako unikalnego identyfikatora lub obiektu w postaci mnemonicznej. Tak więc fakt, że jest to liczba, jest nieistotny; możesz równie dobrze myśleć o tym jak o łańcuchu mieszającym. Cóż, tak się składa, że ​​naszemu mózgowi łatwiej jest (w celu porównania) zachować krótkie ciągi składające się z 16 różnych znaków, niż dłuższe struny składające się tylko z 10 różnych znaków.

+3

W powiązanej notatce, jeśli liczby były wyświetlane w systemie dziesiętnym, ludzie mogą być bardziej skłonni oczekiwać, że będą "znaczyć" coś. Na przykład "Fnord # 194" brzmi dużo bardziej jak 194. Fnord niż "Fnord @ 159C8EA5". Z punktu widzenia mnemoników inne kodowanie alfanumeryczne mogło być krótsze i łatwiejsze do rozróżnienia, ale myślę, że Java chciała uniknąć jakiejkolwiek możliwości tworzenia sekwencji liter, które można by uznać za obraźliwe. – supercat

+0

Używamy go tylko do tego celu. Muszę wiedzieć (w czasie sztormu), którą Persist bolt z 5 mamy utrzymuje się w jakiej ilości. Dlatego w naszym rejestrowaniu używamy tego do sortowania na pojedynczym wystąpieniu śruby. – markthegrea

Powiązane problemy