a che servono i metodi equals e hashcode e perche' vengono spesso considerati in coppia?
grazie in anticipo a tt!
a che servono i metodi equals e hashcode e perche' vengono spesso considerati in coppia?
grazie in anticipo a tt!
Dai una occhiata qui
hashCode viene usato tipicamente nelle tabelle di hash come HashMap o Hashtable per confrontare le chiavi di ricerca.
equals viene usato per verificare se due oggetti sono uguali. In termini di riferiemento oppure in termini di campi, a seconda se parliamo del metodo equals di Object o di un metodo realizzato ad hoc.
"Ethics are to me something private. Whenever you use it as an argument for why somebody_else should do something, you’re no longer being ethical, you’re just being a sanctimonious dick-head"
Linus Torvalds
Non serve per "confrontare" le chiavi di ricerca. Un hash code serve per trovare il giusto "bucket" all'interno della tabella hash.Originariamente inviato da Pastore12
per confrontare le chiavi di ricerca.
Corretto (anche se a dire il vero la implementazione in Object è un po' "degenere" nel senso che è l'unica cosa che può fare...).Originariamente inviato da Pastore12
equals viene usato per verificare se due oggetti sono uguali. In termini di riferiemento oppure in termini di campi, a seconda se parliamo del metodo equals di Object o di un metodo realizzato ad hoc.
Comunque aggiungo che tra equals() e hashCode() esiste un "contratto" ben preciso (la documentazione di Object lo spiega, anche se solo a parole).
E se si fa l'override di equals() allora va fatto anche l'override di hashCode() in modo coerente con il contratto. E la implementazione di equals() deve trattare almeno (se non di più) gli stessi campi trattati da hashCode() (altrimenti il contratto si "rompe").
Andrea, andbin.dev – Senior Java developer – SCJP 5 (91%) • SCWCD 5 (94%)
java.util.function Interfaces Cheat Sheet — Java Versions Cheat Sheet
Non serve per "confrontare" le chiavi di ricerca. Un hash code serve per trovare il giusto "bucket" all'interno della tabella hash.mi sembra un eccesso di pignoleria...
hashtable (non ho trovato nulla di meglio)
A me, per una trattazione che non ha la pretesa di essere esaustiva, il termine "confrontare" sembra passabile. Anzi, mi sembra meno corretta ma più comprensibile della definizione che hai dato tu. Di certo il tuo è stato un ottimo spunto per approfondire il discorso, però avresti fatto bene a spiegare brevemente anche cosa sia un bucket (io non lo sapevo...).
Ciao!![]()
"Ethics are to me something private. Whenever you use it as an argument for why somebody_else should do something, you’re no longer being ethical, you’re just being a sanctimonious dick-head"
Linus Torvalds
Ma io sono (molto) pignolo!!!!Originariamente inviato da Pastore12
mi sembra un eccesso di pignoleria...
![]()
bucket = secchio, canestro.Originariamente inviato da Pastore12
però avresti fatto bene a spiegare brevemente anche cosa sia un bucket
Una tabella hash generalmente è implementata come una lista di bucket, tutti gli oggetti con lo stesso hash code vanno a finire nello stesso bucket. In ogni bucket c'è una lista di entry (chiave+valore) che deve essere scandita per trovare la chiave.
Certo ... è una ricerca lineare ma se il calcolo dell'hash code è implementato "bene", gli oggetti sono ben sparpagliati tra i vari bucket.
Una analogia è con quelle enciclopedie multivolume (ogni volume è per 1 lettera o 2). Se cerchi la parola Napoleone, vai subito a prendere il volume della N, non guardi affatto gli altri. Poi chiaramente devi sfogliare quel volume per trovare la parola ....
Andrea, andbin.dev – Senior Java developer – SCJP 5 (91%) • SCWCD 5 (94%)
java.util.function Interfaces Cheat Sheet — Java Versions Cheat Sheet
:quote:
Se guardi nella pagina che ho linkato prima ci sono anche i disegni!![]()
"Ethics are to me something private. Whenever you use it as an argument for why somebody_else should do something, you’re no longer being ethical, you’re just being a sanctimonious dick-head"
Linus Torvalds
Ehm, non vorrei fare l'antipatica iena, ma quindi.... che legame c'è, REALMENTE?
dalla definizione di hashcode, così come è scritta nelle api della classe Object:
However, the programmer should be aware that producing distinct integer results for unequal objects may improve the performance of hashtables.
"Ethics are to me something private. Whenever you use it as an argument for why somebody_else should do something, you’re no longer being ethical, you’re just being a sanctimonious dick-head"
Linus Torvalds
Molto semplice:Originariamente inviato da dottorcere
ma quindi.... che legame c'è, REALMENTE?
Se due oggetti sono uguali secondo equals() allora i loro hash code devono essere uguali. Questa è la regola fondamentale e più importante.
Esiste anche il "rovescio della medaglia": se due oggetti hanno hash code differenti, allora equals() deve indicare che sono diversi.
Ed esistono anche gli altri 2 casi:
- se due oggetti sono diversi, possono avere hash code uguali o differenti (e il fatto di generare hash code il più possibile diversi è l'obiettivo di un "buon" hashCode()).
- se due oggetti hanno hash code uguali, possono essere uguali o no.
Andrea, andbin.dev – Senior Java developer – SCJP 5 (91%) • SCWCD 5 (94%)
java.util.function Interfaces Cheat Sheet — Java Versions Cheat Sheet
Cioè tutti i casi sono contemplati! Da ignorante, mi sembra abbastanza fumosa come cosa... cioè a leggerla così mi sembra una finta dicotomia, dato che tutte le opzioni possono essere vere in tutti i casi....![]()