Objects.hash în Java

hash() calculează un cod hash din mai multe câmpuri (ideal în hashCode()); hashCode(o) dă 0 pentru null.

Sintaxă
static int hash(Object... valori)
static int hashCode(Object o)

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.hash alte câmpuri decât cele din equals: două obiecte egale pot avea coduri diferite.
  • Folosești Objects.hash(x) crezând că dă x.hashCode(); pentru un singur obiect folosește Objects.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.