Se sto usando solo HashMap posso eseguire l'override solo del metodo hashCode?

2

Se devo utilizzare solo HashMap , perché devo sostituire il metodo equals() con hashCode() ? In che modo l'implementazione di equals() non influisce sul funzionamento di HashMap ?

    
posta karan ratnaparkhi 21.09.2016 - 00:22
fonte

1 risposta

7

Il metodo predefinito equals() che il tuo oggetto eredita dalla classe Object esegue un confronto di riferimento. Ciò significa che nessuna istanza dei tuoi oggetti sarà uguale a nessun'altra istanza, perché ogni singola istanza ha un riferimento diverso.

Se no-instance-equal-to-any-other-instance è il comportamento che si desidera, non è necessario implementare hashCode() , perché il hashCode() predefinito si basa anche sui riferimenti di istanza, quindi restituirà anche codici hash univoci. Inoltre, in questo caso, invece di HashMap puoi utilizzare IdentityHashMap che guarda solo ai riferimenti e non si preoccupa di equals() e hashCode() .

Se no-instance-equal-to-any-other-instance è not il comportamento che vuoi, allora temo che sia necessario anche sovrascrivere equals() per indicare che due gli oggetti sono non uguali pur avendo lo stesso codice hash.

Se due oggetti risultano uguali per equals() ma diversi per hashCode() , si tratta di un errore fino a HashMap . Se due oggetti non sono uguali per equals() ma hanno identici codici hash, allora HashMap li considererà come non uguali, e funzionerà, ma subirà la penalità delle prestazioni (dichiaratamente minore) di una collisione del codice hash.

    
risposta data 21.09.2016 - 00:30
fonte

Leggi altre domande sui tag