Devi eseguire l'override correttamente metodo equals() dalla classe Object
Edit: Credo che la mia prima risposta è stato frainteso, probabilmente perché non ero troppo precisi. Così ho deciso di aggiungere ulteriori spiegazioni.
Perché è necessario eseguire l'override di equals()? Bene, perché questo è nel dominio di uno sviluppatore per decidere cosa significa per due oggetti essere uguali. L'uguaglianza di riferimento non è sufficiente per la maggior parte dei casi.
Ad esempio, immagina di avere una HashMap le cui chiavi sono di tipo Persona. Ogni persona ha nome e indirizzo. Ora, vuoi trovare il bean dettagliato usando la chiave. Il problema è che di solito non sei in grado di creare un'istanza con lo stesso riferimento di quella nella mappa. Quello che fai è creare un'altra istanza di classe Person. Chiaramente, l'operatore == non funzionerà qui e dovrai usare equals().
Ma ora arriviamo a un altro problema. Immaginiamo che la tua collezione sia molto grande e tu voglia eseguire una ricerca. L'implementazione ingenua confronterà il tuo oggetto chiave con ogni istanza in una mappa usando equals(). Ciò, tuttavia, sarebbe molto espansivo. E qui arriva l'hashCode(). Come altri hanno sottolineato, hashcode è un numero unico che non deve essere unico. Il requisito importante è che ogni volta che equals() restituisce true per due oggetti, hashCode() deve restituire lo stesso valore per entrambi. L'implicazione inversa non regge, che è una buona cosa, perché hashcode separa le nostre chiavi in tipi di bucket. Abbiamo un piccolo numero di istanze di classe Person in un singolo bucket. Quando eseguiamo una ricerca, l'algoritmo può saltare immediatamente a un bucket corretto e solo ora esegue equals per ogni istanza. L'implementazione per hashCode() pertanto deve distribuire gli oggetti nel modo più uniforme possibile attraverso i bucket.
C'è un altro punto. Alcune raccolte richiedono una corretta implementazione di un metodo hashCode() nelle classi che vengono utilizzate come chiavi non solo per motivi di prestazioni. Gli esempi sono: HashSet e LinkedHashSet. Se non eseguono l'override di hashCode(), il metodo predefinito Oggetto hashCode() consentirà di aggiungere più oggetti "significativi da uguale" al set di "nessun duplicato consentito".
Alcune delle collezioni che utilizzano hashCode()
- HashSet
- LinkedHashSet
- HashMap
Date un'occhiata a queste due classi di comuni apache che vi permetterà di implementare equals() e hashCode() facilmente
L'ho fatto su Google, ma tutti gli esempi che ho trovato non hanno mai spiegato che bisognava scavalcare il metodo equals. –
@AndroidAddict: Allora perché non hai fatto quella domanda? –