List.equals în Java

Două liste sunt egale dacă au aceleași elemente în aceeași ordine, indiferent de clasa lor; hashCode urmează aceeași regulă.

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

Ce face List.equals

a.equals(b) returnează true dacă b este tot o listă, are aceeași lungime și elementele de pe fiecare poziție sunt egale (cu equals). Nu contează implementarea: un ArrayList și un LinkedList cu aceleași elemente sunt egale. Contează ordinea: [1, 2] nu este egal cu [2, 1].

hashCode() este calculat din elemente, după o formulă fixă (pornind de la 1, se înmulțește cu 31 și se adună codul fiecărui element). Listele egale au același hashCode, de aceea pot fi chei într-un HashMap sau elemente într-un HashSet, cu condiția să nu le modifici după ce le-ai pus acolo.

Operatorul == verifică doar dacă două variabile arată spre același obiect; pentru conținut folosește întotdeauna equals.

Parametri

Parametru Descriere
o Obiectul comparat.

Ce returnează

equals: true/false. hashCode: un int calculat din elemente.

Exemple

Exemplul 1: Același conținut, alte clase

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;

public class Main {
    public static void main(String[] args) {
        List<String> a = new ArrayList<>(List.of("Ana", "Mihai"));
        List<String> b = new LinkedList<>(List.of("Ana", "Mihai"));
        List<String> c = List.of("Mihai", "Ana");

        System.out.println("a.equals(b): " + a.equals(b));
        System.out.println("a == b: " + (a == b));
        System.out.println("a.equals(c): " + a.equals(c));
        System.out.println("hashCode: " + a.hashCode() + " " + b.hashCode() + " " + c.hashCode());
    }
}

Rezultat

a.equals(b): true
a == b: false
a.equals(c): false
hashCode: 76388321 76388321 -1990291295

Exemplul 2: Liste ca chei într-un map

Coordonatele [rând, coloană] sunt liste. O listă nouă cu aceleași valori găsește aceeași cheie, pentru că equals și hashCode depind de conținut.

import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class Main {
    public static void main(String[] args) {
        Map<List<Integer>, String> sah = new HashMap<>();
        sah.put(List.of(0, 4), "rege alb");
        sah.put(List.of(7, 4), "rege negru");

        System.out.println(sah.get(List.of(0, 4)));
        System.out.println(sah.get(List.of(3, 3)));
    }
}

Rezultat

rege alb
null

Greșeli frecvente

  • Compari două liste cu == și primești false deși au același conținut.
  • Compari o listă cu un set (lista.equals(set)): rezultatul este mereu false, chiar dacă au aceleași elemente.
  • Modifici o listă care este cheie într-un HashMap: hashCode se schimbă și map-ul nu o mai găsește.

Comenzi înrudite

  • Set.equals: Două mulțimi sunt egale dacă au exact aceleași elemente, indiferent de ordine sau de implementare (HashSet, TreeSet).
  • Map.equals: Două map-uri sunt egale dacă au exact aceleași perechi cheie → valoare, indiferent de ordine sau de implementare.
  • Arrays.equals: Compară două array-uri după conținut: true dacă au aceeași lungime și aceleași elemente pe aceleași poziții.
  • List.contains: Verifică dacă lista conține o valoare (contains) sau toate valorile altei colecții (containsAll).