==, equals() und Identität und Gleichheit: Unterschied zwischen den Versionen
(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 |
||
(Eine dazwischenliegende Version desselben Benutzers wird nicht angezeigt) | |||
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) [[Klasse|Klassen]] immer implizit von der Klasse <code>java.lang.Object</code> . In {{JAPI|Object}} ist die [[Methode]] equals(Object obj) deklariert/definiert: |
− | < | + | <syntaxhighlight lang="java"> |
public boolean equals(Object obj) { | public boolean equals(Object obj) { | ||
return (this == obj); | return (this == obj); | ||
} | } | ||
− | </ | + | </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 [[Variable|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 [[Attribut|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: |
− | < | + | <syntaxhighlight lang="java"> |
public static void main(String[] args) { | public static void main(String[] args) { | ||
String str1 = "1234"; | String str1 = "1234"; | ||
− | String str2 = new String("1234"); // String | + | String str2 = new String("1234"); // solch ein String-Pool ist zu vermeiden |
System.out.println(str1 == str2); // Test auf Identität | System.out.println(str1 == str2); // Test auf Identität | ||
System.out.println(str1.equals(str2)); // Test auf Gleichheit | System.out.println(str1.equals(str2)); // Test auf Gleichheit | ||
Zeile 46: | Zeile 46: | ||
return false; | return false; | ||
} | } | ||
− | </ | + | </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, {{JAPI|List}} und {{JAPI|String}} enthält: |
− | < | + | <syntaxhighlight lang="java"> |
import java.util.ArrayList; | import java.util.ArrayList; | ||
import java.util.List; | import java.util.List; | ||
Zeile 58: | Zeile 58: | ||
private int i = 99; | private int i = 99; | ||
− | private List<String> list = new ArrayList< | + | private List<String> list = new ArrayList<>(64); |
private String string = "stringList"; | private String string = "stringList"; | ||
Zeile 94: | Zeile 94: | ||
} | } | ||
} | } | ||
− | </ | + | </syntaxhighlight> |
− | Hierbei sei ausgeschlossen, dass Attribute der Klasse Vergleichen null sind. | + | Hierbei sei ausgeschlossen, dass Attribute der Klasse <code>Vergleichen</code> <code>null</code> sind. |
--[[Benutzer:iKnwWhtUDidLast|iKnwWhtUDidLast]] 22:50, 08. Aug 2013 (CET) | --[[Benutzer:iKnwWhtUDidLast|iKnwWhtUDidLast]] 22:50, 08. Aug 2013 (CET) | ||
− | |||
[[Kategorie:Java Grundlagen]] | [[Kategorie:Java Grundlagen]] |
Aktuelle Version vom 28. März 2018, 07:55 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"); // solch ein String-Pool ist zu 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<>(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)