Colecții Java – hashCode() și equals() – Cum să suprascrieți metoda equals() și hashcode() în Java?

Publicat: 2018-08-08
Colecții Java hashCode și equals

equals() și hashCode() în Java sunt două metode fundamentale care sunt declarate în clasa Object și biblioteca Java parțială sau de bază.

Dacă aveți una dintre preocupările de mai jos în Java, atunci sunteți în locul potrivit.

  • Practici Java -> Implementarea equals
  • override – Suprascrierea equals și hashCode în Java
  • Cum să suprascrieți metoda equals() în java
  • Cum să suprascrieți metoda hashCode() în java
  • Cum să suprascrieți metoda equals și hashCode în Java
  • Cum și de ce să suprascrieți metoda equals în Java
  • De ce să înlocuiți întotdeauna hashcode() dacă suprascrierea este egală cu ()?

Să aruncăm o privire la un exemplu simplu pentru a înțelege mai întâi egalitatea de Reference Equality Logical Equality . Operatorul de egalitate (==) compară referințele (adresele din memorie) ale celor două șiruri de caractere ca două numere diferite - aceasta este cunoscută sub numele de Reference equality .

Logical equality compară datele obiectelor în loc de valoarea referințelor.

Ieșire:

hashCode și equals sunt strâns legate:

  • dacă suprascrieți equals , trebuie să înlocuiți hashCode .
  • hashCode trebuie să genereze valori egale pentru obiecte egale.
  • equals și hashCode trebuie să depindă de same set of significant fields . Trebuie să utilizați același set de câmpuri în ambele metode. Nu ești obligat să folosești toate câmpurile. De exemplu, un câmp calculat care depinde de alții ar trebui foarte probabil să fie omis din equals și hashCode .

La implementarea equals , câmpurile sunt comparate diferit, în funcție de tipul lor:

  • câmpuri obiect, inclusiv colecții: folosește equals
  • enumerări de tip sigur: utilizați fie equals , fie == (în acest caz, ele echivalează cu același lucru)
  • câmpuri obiect posibil-null: utilizați atât == cât și equals
  • câmpuri matrice: utilizați Arrays.equals
  • câmpuri primitive, altele decât float sau double : utilizați ==
  • float : convertiți în int folosind Float.floatToIntBits , apoi utilizați ==
  • double : convertiți în long folosind Double.doubleToLongBits , apoi utilizați ==

Implementarea hashCode :

  • dacă o clasă suprascrie equals , trebuie să suprascrie hashCode
  • când ambele sunt suprascrise, equals și hashCode trebuie să utilizeze același set de câmpuri
  • dacă două obiecte sunt egale, atunci și valorile lor hashCode trebuie să fie egale
  • dacă obiectul este imuabil, atunci hashCode este un candidat pentru cache și inițializare leneșă

Este o concepție greșită populară că hashCode oferă un identificator unic pentru un obiect. Aceasta nu.

Prin contract general, metoda equals() în Java trebuie să fie reflexivă, simetrică, tranzitivă, consecventă și orice referință non-nulă trebuie să returneze false. Cu alte cuvinte, pentru valorile arbitrare ale a, b și c, următoarele teste trebuie întotdeauna să treacă:

Pentru cea mai bună practică, utilizați pașii de mai jos pentru a implementa metoda equals():

  • Utilizați acest == aceea pentru a verifica egalitatea referințelor
  • Utilizați instanceof pentru a testa tipul corect de argument
  • Transmite argumentul la tipul corect
  • Comparați domenii semnificative pentru egalitate

Iată un exemplu complet.

CrunchifyImplementEqualsHashCode.java

Ieșire consola Eclipse: