Visualizzazione dei risultati da 1 a 7 su 7
  1. #1
    Utente di HTML.it L'avatar di Donovant
    Registrato dal
    Sep 2005
    residenza
    London
    Messaggi
    1,329

    Hashtable e override di equals() e hasCode()

    Riprto qui quello che stavo scrivendo in un altro thread, in cui questo era un po' OT.

    "adbin":
    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.
    "adbin":
    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.
    "adbin":
    Molto semplice:
    Se due oggetti sono uguali secondo equals() allora i loro hash code devono essere uguali. Questa è la regola fondamentale e più importante...
    Citato ivi scritto, mi piacerebbe sapere come fare l'override di equals() e hashCode(), se (come nell'altro topic) utilizzo una Hashtable<Integer, String> ht ???

    equals(); lascio quella di String, quindi va bene ht.get(k1).equals(ht.get(k2) )
    ma per hashCode(); ???....cioè non capisco come fare a far si che se k1 e k2 siano 2 stringhe uguali, questo "contratto" possa andare anche per hashCode...
    Beati gli smemorati, perchè avranno la meglio anche sui loro errori...

    My gallery: http://donovant.deviantart.com/gallery/

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: Hashtable e override di equals() e hasCode()

    Originariamente inviato da Donovant
    Citato ivi scritto, mi piacerebbe sapere come fare l'override di equals() e hashCode(), se (come nell'altro topic) utilizzo una Hashtable<Integer, String> ht ???
    Non devi fare un bel niente. Per una Map è importante che le chiavi rispettino questo contratto. E Integer (le tue chiavi) implementa già correttamente sia equals() che hashCode(), rispettando il contratto.

    Originariamente inviato da Donovant
    equals(); lascio quella di String, quindi va bene ht.get(k1).equals(ht.get(k2) )
    ma per hashCode(); ???....cioè non capisco come fare a far si che se k1 e k2 siano 2 stringhe uguali, questo "contratto" possa andare anche per hashCode...
    Sinceramente non ho capito la tua necessità o il tuo dubbio ..... E' quando definisci una "tua" classe che se fai l'override di equals() dovresti fare l'override anche di hashCode() rispettando il contratto. E questo sopratutto se oggetti di questa tua classe sono usati come chiavi in una Map.

    Vuoi un esempio di violazione "palese" del contratto?? Faccio una classe Persona con 3 proprietà: nome, cognome e annoNascita (int).
    Per implementare equals() vado a confrontare solo nome e cognome dei 2 oggetti. Per implementare hashCode() vado ad usare tutte le 3 proprietà.

    Ma immagina 2 oggetti con questo stato:
    Mario Rossi 1947
    Mario Rossi 1985

    I due oggetti sono uguali secondo equals() ma ..... quasi certamente i due hashcode sono differenti!!! (dipende comunque dalla implementazione di hashCode() ma se uno la fa in modo logico sono sicuramente diversi).

    La regola è che equals() deve essere "accurato" (in termini dei campi presi in considerazione) almeno quanto hashCode(). Per dirla in altro modo: tutti i campi presi in considerazione da hashCode() devono anche essere presi in considerazione da equals().
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Utente di HTML.it L'avatar di Donovant
    Registrato dal
    Sep 2005
    residenza
    London
    Messaggi
    1,329
    Capito....quindi se 2 valori di una Hashtable sono uguali, il loro hashCode differisce per la chiave??? visto che cmq se metto 2 stringhe di stesso valore ottengo hashcode differenti in hashtable.
    Beati gli smemorati, perchè avranno la meglio anche sui loro errori...

    My gallery: http://donovant.deviantart.com/gallery/

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da Donovant
    quindi se 2 valori di una Hashtable sono uguali, il loro hashCode differisce per la chiave??? visto che cmq se metto 2 stringhe di stesso valore ottengo hashcode differenti in hashtable.
    Non c'è alcuna relazione particolare tra una chiave di una Map e il valore associato!!! Cioè è proprio solo una associazione nel senso: ad una chiave è associato un valore. Ma la cosa finisce qui. Non esiste alcuna altra relazione/contratto.

    Quindi continuo a non capire la tua questione ... o il tuo dubbio.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    Utente di HTML.it L'avatar di Donovant
    Registrato dal
    Sep 2005
    residenza
    London
    Messaggi
    1,329
    Questo lo avevo capito...ma siccome k1 String1 e k2 String hanno 2 hashcode diversi, l'unica mia spiegazione è che si utilizza nel calcolo "forse" anche la kiave....boh.

    Non riesco a capire il fatto che tu dici che chiavi diverse con stessa STRINGA abbiano hashcode uguali, mentre a me non risulta quando stampo con System.out....
    Beati gli smemorati, perchè avranno la meglio anche sui loro errori...

    My gallery: http://donovant.deviantart.com/gallery/

  6. #6
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da Donovant
    ma siccome k1 String1 e k2 String hanno 2 hashcode diversi

    Non riesco a capire il fatto che tu dici che chiavi diverse con stessa STRINGA abbiano hashcode uguali
    No ... non ci siamo.

    In una Map basata su una "tabella hash" (precisazione importante ... non l'ho fatta prima) è fondamentale che gli oggetti delle chiavi rispettino il contratto tra equals() e hashCode(). Fin qui probabilmente l'hai capito.

    Se questo contratto viene rispettato, non è possibile che in una Map ci siano 2 chiavi uguali. È possibile che due chiavi diverse abbiano lo stesso hashcode. Questo sì. Ma non è un problema. Perché comunque la Map per cercare una chiave prima usa hashCode() per individuare il "bucket" e poi scansiona la lista linkata sotto il bucket usando equals() su tutte le chiavi nella lista finché non trova la chiave uguale a quella cercata.

    Se due chiavi diverse hanno lo stesso hashcode ... beh, andranno a finire sotto il medesimo bucket. Ma tanto sono diverse, motivo per cui appunto possono coesistere.

    Ti è più chiaro adesso?
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  7. #7
    Utente di HTML.it L'avatar di Donovant
    Registrato dal
    Sep 2005
    residenza
    London
    Messaggi
    1,329
    Oh ora perfetto....quindi stesso hashcode stesso buket e poi da li scansiona con equals...certo certo, ora è chiarissimo.
    Grazie.
    Beati gli smemorati, perchè avranno la meglio anche sui loro errori...

    My gallery: http://donovant.deviantart.com/gallery/

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 © 2025 vBulletin Solutions, Inc. All rights reserved.