Raccolte Java – hashCode() and equals() – Come sovrascrivere il metodo equals() e hashcode() in Java?

Pubblicato: 2018-08-08
Java Collection hashCode e uguali

equals() e hashCode() in Java sono due metodi fondamentali che vengono dichiarati nella classe Object e nella libreria Java di una parte o di base.

Se hai una delle seguenti preoccupazioni in Java, sei nel posto giusto.

  • Pratiche Java -> Implementazione uguale
  • override – Sovrascrivere equals e hashCode in Java
  • Come sovrascrivere il metodo equals() in Java
  • Come sovrascrivere il metodo hashCode() in Java
  • Come eseguire l'override del metodo equals e hashCode in Java
  • Come e perché sovrascrivere il metodo equals in Java
  • Perché sovrascrivere sempre hashcode() se si esegue l'override equals()?

Diamo un'occhiata a un semplice esempio per comprendere prima l'uguaglianza di Reference Equality Logical Equality . L'operatore di uguaglianza (==) confronta i riferimenti (indirizzi in memoria) delle due stringhe come due numeri diversi, noto come Reference equality .

Logical equality confronta i dati degli oggetti invece del valore dei riferimenti.

Produzione:

hashCode e equals sono strettamente correlati:

  • se si esegue l'override di equals , è necessario eseguire l'override di hashCode .
  • hashCode deve generare valori uguali per oggetti uguali.
  • equals e hashCode devono dipendere dallo same set of significant fields . È necessario utilizzare lo stesso insieme di campi in entrambi questi metodi. Non è necessario utilizzare tutti i campi. Ad esempio, molto probabilmente un campo calcolato che dipende da altri dovrebbe essere omesso da equals e hashCode .

Quando si implementa equals , i campi vengono confrontati in modo diverso, in base al tipo:

  • campi oggetto, incluse le raccolte: usa uguale
  • enumerazioni type-safe: usa equals o == (equivalgono alla stessa cosa, in questo caso)
  • campi oggetto possibilmente-null : usa sia == che uguale
  • campi dell'array: utilizzare Arrays.equals
  • campi primitivi diversi da float o double : use ==
  • float : converti in int usando Float.floatToIntBits , quindi usa ==
  • double : converti in long usando Double.doubleToLongBits , quindi usa ==

Implementazione hashCode :

  • se una classe esegue l'override di equals , deve eseguire l'override di hashCode
  • quando sono entrambi sovrascritti, equals e hashCode devono utilizzare lo stesso insieme di campi
  • se due oggetti sono uguali, anche i loro valori hashCode devono essere uguali
  • se l'oggetto è immutabile, hashCode è un candidato per la memorizzazione nella cache e l'inizializzazione pigra

È un malinteso popolare che hashCode fornisca un identificatore univoco per un oggetto. Non è così.

Per contratto generale, il metodo equals() in Java deve essere riflessivo, simmetrico, transitivo, coerente e qualsiasi riferimento non nullo deve restituire false. In altre parole, per valori arbitrari di a, b e c, devono sempre superare i seguenti test:

Per la procedura consigliata, utilizzare i passaggi seguenti per implementare il metodo equals():

  • Usa this == that per verificare l'uguaglianza di riferimento
  • Usa instanceof per verificare il tipo di argomento corretto
  • Trasmetti l'argomento al tipo corretto
  • Confronta i campi significativi per l'uguaglianza

Ecco un esempio completo.

CrunchifyImplementEqualsHashCode.java

Uscita console Eclipse: