Ce face Objects.hash
Objects.hash(a, b, c) combină codurile hash ale tuturor valorilor primite într-un singur int. Este cea mai simplă cale de a scrie metoda hashCode() a unei clase: dai aceleași câmpuri pe care le folosește equals. Valorile null sunt acceptate.
Objects.hashCode(o) returnează o.hashCode() sau 0 dacă o este null. Atenție la diferență: Objects.hash(x) cu un singur argument nu dă același rezultat ca Objects.hashCode(x), pentru că primul lucrează cu un array de valori (rezultatul este 31 + x.hashCode()).
Parametri
| Parametru | Descriere |
|---|---|
valori |
Câmpurile din care se calculează codul (număr variabil de argumente). |
o |
Obiectul, poate fi null. |
Ce returnează
Un int, codul hash.
Exemple
Exemplul 1: Coduri hash pentru valori simple
Codurile pentru String și Integer sunt calculate după o formulă fixă, deci sunt aceleași la fiecare rulare.
import java.util.Objects;
public class Main {
public static void main(String[] args) {
System.out.println(Objects.hash("Ana", 21));
System.out.println(Objects.hash("Ana", 21) == Objects.hash("Ana", 21));
System.out.println(Objects.hashCode(null));
System.out.println(Objects.hashCode("Ana") + " " + "Ana".hashCode());
System.out.println(Objects.hash("Ana"));
}
}
Rezultat
2046114
true
0
65972 65972
66003
Exemplul 2: hashCode pentru o clasă proprie
import java.util.HashMap;
import java.util.Map;
import java.util.Objects;
public class Main {
static class Adresa {
final String oras;
final String strada;
Adresa(String oras, String strada) {
this.oras = oras;
this.strada = strada;
}
@Override
public boolean equals(Object o) {
return o instanceof Adresa a && Objects.equals(oras, a.oras) && Objects.equals(strada, a.strada);
}
@Override
public int hashCode() {
return Objects.hash(oras, strada);
}
}
public static void main(String[] args) {
Map<Adresa, String> locatari = new HashMap<>();
locatari.put(new Adresa("Iași", "Lăpușneanu 5"), "Familia Popescu");
String cine = locatari.get(new Adresa("Iași", "Lăpușneanu 5"));
System.out.println(cine);
System.out.println(new Adresa("Cluj", null).hashCode() == new Adresa("Cluj", null).hashCode());
}
}
Rezultat
Familia Popescu
true
Greșeli frecvente
- Incluzi în
Objects.hashalte câmpuri decât cele dinequals: două obiecte egale pot avea coduri diferite. - Folosești
Objects.hash(x)crezând că dăx.hashCode(); pentru un singur obiect foloseșteObjects.hashCode(x).
Comenzi înrudite
Object.equals: equals() spune dacă două obiecte sunt „egale”, iar hashCode() dă un număr folosit de HashMap și HashSet; se suprascriu împreună.Objects: Clasa java.util.Objects are metode statice care lucrează sigur cu null; equals() compară două obiecte care pot fi null.String.hashCode: Returnează codul hash al textului, calculat după o formulă fixă; șirurile egale au mereu același cod.equals și hashCode: equals decide când două obiecte sunt „egale” ca valoare; hashCode trebuie rescris împreună cu el, altfel HashMap și HashSet nu funcționează corect.