==, equals() und Identität und Gleichheit
Ohne dass man es angibt oder nicht, erben alle (selbst geschriebenen) Klassen immer implizit von der Klasse java.lang.Object . In Object ist die Methode equals(Object obj) deklariert/definiert: <code=java>
public boolean equals(Object obj) { return (this == obj); }
</code=java> Wie zu sehen ist, überprüft diese Methode auf referenzielle Gleichheit (Identität). Der Wert zweier Variablen ist nur identisch, wenn es sich um ein und dasselbe Objekt handelt (Datentyp: Referenz-Typ), also zwei Variablen auf dasselbe Objekt referenzieren/zeigen.
Oft will man aber den Inhalt von zwei Objekten vergleichen (inhaltliche Gleichheit (= Gleichheit)). Damit ist z. B. die Gleichheit aller Attribute/Objektvariablen von zwei Objekten/Klassen/Variablen gemeint. Deshalb muss die Methode equals() aus Objekt überschrieben werden. Standardmäßig überschreiben auch "alle" Klassen der Java-SE-API diese Methode und geben eine richtige Implementierung / ein richtiges Verhalten vor. Beispiel String: <code=java>
public static void main(String[] args) { String str1 = "1234"; String str2 = new String("1234"); // String pool vermeiden System.out.println(str1 == str2); // Test auf Identität System.out.println(str1.equals(str2)); // Test auf Gleichheit
str1 = str2; //... zeigen auf dasselbe Objekt System.out.println(str1 == str2); // Test auf Identität System.out.println(str1.equals(str2)); // Test auf Gleichheit
str2 = "2341"; System.out.println(str1 == str2); // Test auf Identität System.out.println(str1.equals(str2)); // Test auf Gleichheit }
public boolean equals(Object anObject) { if (this == anObject) { return true; } if (anObject instanceof String) { String anotherString = (String)anObject; int n = count; if (n == anotherString.count) { char v1[] = value; char v2[] = anotherString.value; int i = offset; int j = anotherString.offset; while (n-- != 0) { if (v1[i++] != v2[j++]) return false; } return true; } } return false; }
</code=java> Man sollte selber in einer eigenen Klasse equals() z. B. wie folgt überschreiben, wenn die Klasse z. B. 3 Attribute vom Typ int, List und String enthält: <code=java> import java.util.ArrayList; import java.util.List;
/**
* @author */
public class Vergleichen {
private int i = 99; private List<String> list = new ArrayList<String>(64); private String string = "stringList";
public Vergleichen(int i, String string) { //... auf null prüfen, // Variablen setzen this.i = i; this.string = string; }
//... weitere Methoden
@Override public boolean equals(Object obj) { if (obj == null) { return false; } if (getClass() != obj.getClass()) { //... oder instanceof-Operator return false; } final Vergleichen other = (Vergleichen) obj; if (this.i != other.i) { return false; } if ( !this.list.equals(other.list) ) { return false; } if ( !this.string.equals(other.string) ) { return false; } return true; }
public static void main(String[] args) { }
} </code=java> Hierbei sei ausgeschlossen, dass Attribute der Klasse Vergleichen null sind.
--iKnwWhtUDidLast 22:50, 08. Aug 2013 (CET)