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știfalsedeși au același conținut. - Compari o listă cu un set (
lista.equals(set)): rezultatul este mereufalse, chiar dacă au aceleași elemente. - Modifici o listă care este cheie într-un
HashMap:hashCodese 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).