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 varatrueför alla icke-nullx. - Symmetri:
x.equals(y)ska varatrueendast omy.equals(x)ärtrue, för alla icke-nullxochy. - Transitivitet: Om
x.equals(y)ochy.equals(z)ärtrue, så skax.equals(z)också varatrueför alla icke-nullx,yochz. - 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 varafalse.
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).