==, equals() und Identität und Gleichheit: Unterschied zwischen den Versionen

Aus Byte-Welt Wiki
Zur Navigation springenZur Suche springen
(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…“)
 
K
Zeile 1: Zeile 1:
 
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:
 
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>
+
<syntaxhighlight lang="java">
 
     public boolean equals(Object obj) {
 
     public boolean equals(Object obj) {
 
         return (this == obj);
 
         return (this == obj);
 
     }
 
     }
</code=java>
+
</syntaxhighlight>
 
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.
 
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:
 
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>
+
<syntaxhighlight lang="java">
 
     public static void main(String[] args) {
 
     public static void main(String[] args) {
 
         String str1 = "1234";
 
         String str1 = "1234";
Zeile 46: Zeile 46:
 
         return false;
 
         return false;
 
     }
 
     }
</code=java>
+
</syntaxhighlight>
 
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:
 
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>
+
<syntaxhighlight lang="java">
 
import java.util.ArrayList;
 
import java.util.ArrayList;
 
import java.util.List;
 
import java.util.List;
Zeile 94: Zeile 94:
 
     }
 
     }
 
}
 
}
</code=java>
+
</syntaxhighlight>
 
Hierbei sei ausgeschlossen, dass Attribute der Klasse Vergleichen null sind.
 
Hierbei sei ausgeschlossen, dass Attribute der Klasse Vergleichen null sind.
  

Version vom 9. März 2018, 15:01 Uhr

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:

    public boolean equals(Object obj) {
        return (this == obj);
    }

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:

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

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:

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) {
    }
}

Hierbei sei ausgeschlossen, dass Attribute der Klasse Vergleichen null sind.

--iKnwWhtUDidLast 22:50, 08. Aug 2013 (CET)