==, equals() und Identität und Gleichheit

Aus Byte-Welt Wiki
Version vom 8. August 2013, 23:22 Uhr von IKnwWhtUDidLast (Diskussion | Beiträge) (Die Seite wurde neu angelegt: „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(Ob…“)
(Unterschied) ← Nächstältere Version | Aktuelle Version (Unterschied) | Nächstjüngere Version → (Unterschied)
Zur Navigation springenZur Suche springen

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)