A, C e D, hashCode()
potrebbe restituire un risultato diverso per 2 casi di cui Person
equals()
metodo restituisce true
, cioè due Person
s che sono uguali potrebbe restituire diversi codici hash.
Questo viola chiaramente contratto Object.hashCode()
s':
se due oggetti sono uguali secondo il metodo equals (Object), quindi la chiamata al metodo hashCode su ciascuno dei due oggetti deve produrre lo stesso risultato intero.
per C e D, se due Person
s avevano la stessa età e il nome, ma un commento diverso, equals()
sarebbero tornati true
, mentre hashCode()
produrrebbe valori diversi.
A, come Person
discende implicitamente dalla classe Object
(cioè esso non si estende da qualsiasi superclasse esplicito), il risultato di super.hashCode()
sarebbe uguali solo quando viene richiamata nella stessa istanza. Secondo Object.hashCode()
documenti:
Per quanto ragionevolmente possibile, il metodo hashCode definito dalla classe Object non ritorno interi distinti per oggetti distinti. (Questo in genere viene implementato convertendo l'indirizzo interno dell'oggetto in un numero intero, ma questa tecnica di implementazione non è richiesta dal linguaggio di programmazione Java ™.)
Quindi, se tu avessi due diverse istanze della classe Person
, entrambi con lo stesso nome, l'età e commentare, equals()
sarebbero tornati true
, mentre hashCode()
sarebbe restituire valori diversi, violando hashCode()
s' contratto.
In pratica, ciò significa che la classe Person
non può essere la chiave di qualsiasi Map
.
fonte
2015-03-29 16:36:13
È possibile utilizzare uno di questi metodi hashcode (A potrebbe non dare buoni risultati), ma B è il più semplice. – JonasCz
@JonasCz C e D sono errati perché non sono coerenti con gli uguali –