Bardzo ostatni akapit pkt 9 z Effective Java, 2-gie wydanie, J. Bloch mówi, że dla klas wartości jak Integer
, String
, Date
itp przekazujących funkcję dokładnej wartości, które klasa jako the hashCode
nie jest dobrym pomysłem.Dlaczego wartość klasy wartości jest jego hashCode "nie jest dobrym pomysłem"?
Tak więc klasa Integer
zwracająca value
liczby całkowitej, którą reprezentuje jako hashCode
, nie jest tak dobra.
Nie jest również hashCode()
z String
zwracająca wartość całkowitą bezpośrednio odwzorowaną z ogólnej treści, tj. Znaków, które ma instancja String
.
Te hashCode()
- są wyraźnie zgodne z umową.
Dla mnie wygląda na to, że jest to dobry pomysł, a nie zły - hashCode
- różnią się w zależności od wartości różnych obiektów, a te hashCodes
są "znormalizowane", zanim zostaną rozłożone na wiadra HashMap
/HashSet
- tak że hashCode
-s z wpisami nie tworzą nastawienie na którym wiadro wpis trafi w
Co ja tu brakuje. - Co sprawia, że mapowanie wartości klasy bezpośrednio do hashCode
„zły pomysł"?
TIA
// ===========================
EDIT zobaczyć
pls także komentarze w odpowiedzi na pytanie Steve'a Sieberta.
zgadzam się z tym. ale rozwiązanie tego problemu powinno wymusić zasadę, że "hashCode" nie może być używany jako wskaźnik/funkcjonalny substytut "wartości", a raczej niż wchodzenie pomiędzy tą miłą relację między 'wartością' i' hashCode() 'i tym samym pomiędzy' equals() 'i' hashCode() '. – Roam
Całkowicie się z tobą zgadzam, a hashCode może być w praktyce traktowany jako taki, który zwraca "mniej inteligentny/stratny" obraz rzeczywistej wartości obiektu - podatny na paradoks urodzin. Ale tak naprawdę hash nie jest konieczny * trzeba * mieć relacjęscript z wartością ... hashCode musi zawsze zwracać tę samą wartość int dla tego samego obiektu (jednak jest to zdefiniowane przez ciebie), więc obiekt można znaleźć w oczekiwane wiadro. Zwykle odbywa się to poprzez mieszanie jednej/więcej wartości obiektu ... co ma sens. Ale jeśli można to zrobić, powiedzmy ... magii ... to kim ja jestem, by sądzić? =) –
przywiązanie 'hashCode' do' wartości' zapewniłoby, że "jeśli dwa obiekty nie są równe, to żaden z nich nie jest ich hashCodes" i jest to dobre rozwiązanie dla równomiernie rozmieszczonych wpisów w mieszających się mieszających tablicach - chociaż nie jest to wymóg określony w umowie. Nie widziałem ani nie mogę wymyślić lepszego sposobu na zrobienie tego. – Roam