Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 13

Discussione: Equals e Hashcode

  1. #1

    Equals e Hashcode

    a che servono i metodi equals e hashcode e perche' vengono spesso considerati in coppia?

    grazie in anticipo a tt!

  2. #2
    Utente di HTML.it L'avatar di Pastore12
    Registrato dal
    Oct 2008
    Messaggi
    1,051
    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

  3. #3
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da Pastore12
    per confrontare le chiavi di ricerca.
    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
    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.
    Corretto (anche se a dire il vero la implementazione in Object è un po' "degenere" nel senso che è l'unica cosa che può fare...).

    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.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  4. #4
    Utente di HTML.it L'avatar di Pastore12
    Registrato dal
    Oct 2008
    Messaggi
    1,051
    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

  5. #5
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da Pastore12
    mi sembra un eccesso di pignoleria...
    Ma io sono (molto) pignolo!!!!

    Originariamente inviato da Pastore12
    però avresti fatto bene a spiegare brevemente anche cosa sia un bucket
    bucket = secchio, canestro.
    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.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  6. #6
    Utente di HTML.it L'avatar di Pastore12
    Registrato dal
    Oct 2008
    Messaggi
    1,051
    :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

  7. #7
    Ehm, non vorrei fare l'antipatica iena, ma quindi.... che legame c'è, REALMENTE?

  8. #8
    Utente di HTML.it L'avatar di Pastore12
    Registrato dal
    Oct 2008
    Messaggi
    1,051
    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

  9. #9
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da dottorcere
    ma quindi.... che legame c'è, REALMENTE?
    Molto semplice:
    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.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  10. #10
    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....

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2026 vBulletin Solutions, Inc. All rights reserved.