Map.equals în Java

Două map-uri sunt egale dacă au exact aceleași perechi cheie → valoare, indiferent de ordine sau de implementare.

Sintaxă
boolean equals(Object o)
int hashCode()

Ce face Map.equals

a.equals(b) returnează true dacă b este tot un Map și conține exact aceleași chei, fiecare cu o valoare egală. Ordinea nu contează: un HashMap, un TreeMap și un Map.of cu aceleași perechi sunt egale.

hashCode() este suma codurilor hash ale perechilor, deci map-urile egale au același cod. Valorile se compară cu equals: pentru valori care sunt array-uri (int[]), comparația verifică identitatea obiectelor, nu conținutul.

Parametri

Parametru Descriere
o Obiectul cu care se compară.

Ce returnează

equals: boolean. hashCode: int.

Exemple

Exemplul 1: Aceleași perechi, implementări diferite

import java.util.HashMap;
import java.util.Map;
import java.util.TreeMap;

public class Main {
    public static void main(String[] args) {
        Map<String, Integer> a = new HashMap<>();
        a.put("Iași", 3);
        a.put("Cluj", 5);
        Map<String, Integer> b = new TreeMap<>(Map.of("Cluj", 5, "Iași", 3));
        Map<String, Integer> c = Map.of("Cluj", 5, "Iași", 4);
        System.out.println("a = b: " + a.equals(b));
        System.out.println("a = c: " + a.equals(c));
        System.out.println("hash egal a, b: " + (a.hashCode() == b.hashCode()));
    }
}

Rezultat

a = b: true
a = c: false
hash egal a, b: true

Exemplul 2: Verifică dacă stocul s-a schimbat

import java.util.Map;
import java.util.TreeMap;

public class Main {
    public static void main(String[] args) {
        Map<String, Integer> stoc = new TreeMap<>(Map.of("mere", 10, "pere", 4));
        Map<String, Integer> salvat = Map.copyOf(stoc);
        System.out.println("Schimbat? " + !stoc.equals(salvat));
        stoc.merge("pere", -1, Integer::sum);
        System.out.println("Schimbat? " + !stoc.equals(salvat));
    }
}

Rezultat

Schimbat? false
Schimbat? true

Greșeli frecvente

  • Compari map-uri cu ==. Operatorul verifică dacă e același obiect.
  • Ai ca valori array-uri și aștepți ca equals să compare conținutul. Folosește liste în loc de array-uri sau compară cu Arrays.equals.

Comenzi înrudite

  • Map: Interfața pentru dicționare: perechi cheie → valoare, în care găsești rapid valoarea după cheie. Cheile sunt unice.
  • Set.equals: Două mulțimi sunt egale dacă au exact aceleași elemente, indiferent de ordine sau de implementare (HashSet, TreeSet).
  • List.equals: Două liste sunt egale dacă au aceleași elemente în aceeași ordine, indiferent de clasa lor; hashCode urmează aceeași regulă.
  • Arrays.equals: Compară două array-uri după conținut: true dacă au aceeași lungime și aceleași elemente pe aceleași poziții.