Sobes.tech
Junior

Čo robí metóda equals() v Jave?

sobes.tech AI

Odpoveď od AI

Metóda equals() v Jave sa používa na porovnanie obsahu dvoch objektov. Predvolene, v triede Object, porovnáva referencie na objekty, teda určuje, či dve premenné ukazujú na ten istý objekt v pamäti.

Avšak, väčšina tried v Jave (napríklad String, Integer) túto metódu prepíše tak, aby porovnávala hodnoty obsiahnuté v objektoch, nie ich referencie.

Pri prepísaní equals() je dôležité dodržiavať jeho zmluvu:

  • Reflexivita: x.equals(x) by malo byť true pre akékoľvek nenulové x.
  • Symetria: x.equals(y) by malo byť true ak a len ak y.equals(x) je true, pre všetky nenulové x a y.
  • Transitivita: Ak sú x.equals(y) a y.equals(z) true, tak x.equals(z) by malo byť true pre všetky nenulové x, y, z.
  • Konzistentnosť: Viacnásobné volania x.equals(y) by malo vracať rovnaký výsledok, pokiaľ sa objekty nezmenili.
  • **Pre akékoľvek nenulové x, x.equals(null) by malo byť false.

Príklad prepísania equals():

class MyObject {
    private int value;

    public MyObject(int value) {
        this.value = value;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj) {
            return true;
        }
        if (obj == null || getClass() != obj.getClass()) {
            return false;
        }
        MyObject myObject = (MyObject) obj;
        return value == myObject.value;
    }
}

Použitie equals():

// Porovnanie podľa odkazu (štandardne v Object)
Object obj1 = new Object();
Object obj2 = new Object();
boolean podlaOdkazu = obj1.equals(obj2); // false

// Porovnanie podľa hodnoty (po prepísaní `equals`)
MyObject myObj1 = new MyObject(10);
MyObject myObj2 = new MyObject(10);
boolean podlaHodnoty = myObj1.equals(myObj2); // true

Je tiež dôležité prepísať metódu hashCode(), keď prepíšete equals(), aby ste zachovali ich zmluvu a predišli problémom s kolekciami založenými na hashovaní, ako sú HashMap, HashSet.