Sobes.tech
Junior

Mida teeb meetod equals() Java-s?

sobes.tech AI

Vastus AI-lt

Java equals() meetod används för att jämföra innehållet i två objekt. Som standard, i Object-klassen, jämför den referenser till objekten, det vill säga, den avgör om två variabler pekar på samma minnesobjekt:

Men de flesta klasser i Java (t.ex. String, Integer) överskuggar denna metod för att jämföra värdena som finns i objekten, inte deras referenser:

När du överskuggar equals() är det viktigt att följa dess kontrakt:

  • Reflexivitet: x.equals(x) ska vara true för alla icke-null x.
  • Symmetri: x.equals(y) ska vara true endast om y.equals(x) är true, för alla icke-null x och y.
  • Transitivitet: Om x.equals(y) och y.equals(z) är true, så ska x.equals(z) också vara true för alla icke-null x, y och z.
  • Konsistens: Flera anrop av x.equals(y) ska ge samma resultat, så länge objekten inte har ändrats.
  • **För alla icke-null x, x.equals(null) ska vara false.

Exempel på att överskugga 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;
    }
}

Användning av equals():

// Referensjämförelse (standard i `Object`)
Object obj1 = new Object();
Object obj2 = new Object();
boolean byReference = obj1.equals(obj2); // false

// Värdejämförelse (med överskriven `equals`)
MyObject myObj1 = new MyObject(10);
MyObject myObj2 = new MyObject(10);
boolean byValue = myObj1.equals(myObj2); // true

Det är också viktigt att överskriva hashCode()-metoden tillsammans med equals() för att bevara deras kontrakt och undvika problem med samlingar som använder hashing (t.ex. HashMap, HashSet).