Sobes.tech
Junior

Šta radi metoda equals() u Javi?

sobes.tech АИ

Одговор од АИ

Metoda equals() u Javi se koristi za poređenje sadržaja dva objekta. Podrazumevano, u klasi Object, ona poredi reference na objekte, tj. određuje da li dve promenljive ukazuju na isti objekat u memoriji.

Međutim, većina klasa u Javi (npr. String, Integer) redefiniše ovu metodu da bi poređivale vrednosti sadržane u objektima, a ne njihove reference.

Prilikom redefinisanja equals(), važno je pridržavati se njenog ugovora:

  • Refleksivnost: x.equals(x) treba da bude true za svaki nenull x.
  • Simbetria: x.equals(y) treba da bude true ako i samo ako y.equals(x) jeste true, za sve nenull x i y.
  • Transitivnost: Ako su x.equals(y) i y.equals(z) true, onda i x.equals(z) treba da bude true za sve nenull x, y, z.
  • Konzistentnost: Višekratni pozivi na x.equals(y) treba da vraćaju isti rezultat, sve dok se objekti ne promene.
  • **Za svaki nenull x, x.equals(null) treba da bude false.

Primer redefinisanja 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;
    }
}

Korišćenje equals():

// Poređenje po referenci (po default-u u Object)
Object obj1 = new Object();
Object obj2 = new Object();
boolean poReferenci = obj1.equals(obj2); // false

// Poređenje po vrednosti (nakon redefinisanja `equals`)
MyObject myObj1 = new MyObject(10);
MyObject myObj2 = new MyObject(10);
boolean poVrednosti = myObj1.equals(myObj2); // true

Takođe je važno redefinisati metodu hashCode() kada redefinišete equals(), kako biste sačuvali njihov ugovor i izbegli probleme sa kolekcijama koje koriste heširanje, poput HashMap, HashSet.