Sobes.tech
Junior

Co dělá metoda equals() v Java?

sobes.tech AI

Odpověď od AI

Metoda equals() v Javě se používá ke srovnání obsahu dvou objektů. Ve výchozím nastavení, v třídě Object, porovnává odkazy na objekty, tj. určuje, zda dvě proměnné odkazují na stejný objekt v paměti.

Nicméně, většina tříd v Javě (například String, Integer) tuto metodu přepisuje tak, aby porovnávala hodnoty obsažené v objektech, nikoli jejich odkazy.

Při přepisování equals() je důležité dodržovat její kontrakt:

  • Reflexivita: x.equals(x) by mělo být true pro jakýkoli nenulový x.
  • Symetrie: x.equals(y) by mělo být true právě tehdy, když y.equals(x) je true, pro všechny nenulové x a y.
  • Transitivita: Pokud jsou x.equals(y) a y.equals(z) true, pak by mělo být x.equals(z) také true pro všechny nenulové x, y, z.
  • Konzistence: Vícenásobné volání x.equals(y) by mělo vracet stejný výsledek, pokud se objekty nezměnily.
  • **Pro jakékoli nenulové x, by x.equals(null) mělo být false.

Příklad přepsání 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žití equals():

// Porovnání podle odkazu (výchozí v Object)
Object obj1 = new Object();
Object obj2 = new Object();
boolean podleOdkazu = obj1.equals(obj2); // false

// Porovnání podle hodnoty (po přepsání `equals`)
MyObject myObj1 = new MyObject(10);
MyObject myObj2 = new MyObject(10);
boolean podleHodnoty = myObj1.equals(myObj2); // true

Je také důležité přepsat metodu hashCode(), když přepisujete equals(), aby byl zachován jejich kontrakt a předešlo se problémům s kolekcemi založenými na hashování, například HashMap, HashSet.