Faq (fürs Wiki): Object.equals(), String.equals(), ==, equals() und Vergleich Referenz und Inhalt
Ohne dass man es angibt oder nicht, erben alle (selbst geschriebenen) Klassen implizit von der Klasse java.lang.Object . In Object ist die Methode equals(Object obj) deklariert/definiert:
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 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:
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 selbst sollte in einer eigenen Klasse equals() z. B. wie folgt definieren, wenn die Klasse z. B. 3 Attribute List, int 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) {
//....
this.i = i;
this.string = string;
}
//....
@Override
public boolean equals(Object obj) {
if (obj == null) {
return false;
}
if (getClass() != obj.getClass()) {
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) {
}
}```
(Dabei ist ausgeschlossen, dass list oder string von obj null sein könnte)
warum möchtest ausgerechnet du etwas für eine FAQ schreiben?
es ist ja schon Wunder genug wie manche User bleiben, obwohl offensichtlich von so vielen ‘nicht innig gemocht’,
aber musst du jetzt auch noch die Bredouille schaffen, deine Beiträge in eine FAQ aufzunehmen oder etwas dagegen zu begründen?
hmm…
Ja, stimmt, es ganz besonders Schlimm, anderen helfen zu wollen, und von Slater nicht gemocht zu werden… Bei manchen Beiträgen von dir fällt mir nur noch facepalm ein
wenn man in den meisten Threads liest, wie schrecklich diese Hilfe ist und damit dann noch weitermacht,
dann ist der reine Wille zur Hilfe tatsächlich eher schädlich als hilfreich
im Gegensatz zu vielen anderen bist du bei mir aber vor bösen Worten sicher, nur ernste Andachen, wo nötig
lass es mich so formulieren: die Frage kam in den letzten Tag auf und ich habe dazu im Wiki des byte-welt.net-Forums noch nichts gefunden.
Deine Häme geht aber langsam zu weit, auch ich hatte (wenn auch nur ein Dreißigstel) Beiträge in dem anderen Forum und habe den neuen Besitzer nicht provozieren müssen. Auch hatte ich nicht einfach so meine Macht als Moderator gebraucht, um andere Benutzer zu sperren.
[QUOTE=iKnwWhtUDidLast]lass es mich so formulieren: die Frage kam in den letzten Tag auf und ich habe dazu im Wiki des byte-welt.net-Forums noch nichts gefunden.
Deine Häme geht aber langsam zu weit, auch ich hatte (wenn auch nur ein Dreißigstel) Beiträge in dem anderen Forum und habe den neuen Besitzer nicht provozieren müssen. Auch hatte ich nicht einfach so meine Macht als Moderator gebraucht, um andere Benutzer zu sperren.[/QUOTE]
SlaterB wollte dich glaube ich darauf hinweisen, dass du nicht die nötigen Kompetenzen mitbringst, um solche Übersichtsartikel zu schreiben. Und zwar weder sprachlich, noch inhaltlich in Java.
Böse zungen würden jetzt schreiben:
40% davon sind Gebettel nach Danke
und 50% die Rechtfertigung, warum du jetzt ein Danke verdient hast
und zu den restlichen 10% kann man nix gutes schreiben
… aber da ich nicht böse bin schreibe ich das jetzt mal nicht
Man sollte selber in einer eigenen Klasse equals(), z. B., wie folgt überschreiben, wenn in der Klasse, z. B., 3 Attribute vom Typ List, int und String enthalten sind:
(Dabei sei sichergestellt, dass die Variablen list und string nicht null sind)
Bitte bitte nicht ins Wiki, wer soll das alles jemals reparieren
a) die eigenen (!) und auch die anderen können sehr wohl null sein, man muss ja nur im Konstruktor null übergeben
b) equals aber nicht hashCode, totaler Müll
c) getClass versus instanceOf -> Vererbungsproblematik
d) static main in einem Beispiel?
Und weil die Membervariable nur List ist, müsste man kontrollieren, ob other.list auch eine Arraylist ist und ob ggf. die Semantik other.list.equals und this.list.equals die Symmetrie garantiert (könnte sein dass das automatisch ist?)
Nein, atm weiß ich es noch nicht. Aber morgen werd’ ich das noch mal überarbeiten und dann hochladen.
[QUOTE=Bleiglanz;24514]a) die eigenen (!) und auch die anderen können sehr wohl null sein, man muss ja nur im Konstruktor null übergeben
b) equals aber nicht hashCode, totaler Müll
c) getClass versus instanceOf → Vererbungsproblematik
d) static main in einem Beispiel?[/QUOTE]
a) Ich wollte im Konstruktor nur andeuten (siehe // …), dass dort normalerweise Variablen übergeben werden, eine Prüfung auf null fehlt allerdings.
b) Es geht doch nur um den genauen inhaltlichen Vergleich von zwei Objekten, die api doc gibt auch nur Empfehlungen, beides gleichzeitig zu überschreiben/zu implementieren.
c) Das ist eine offene Frage, ob Instanzen von sub classes auch gleich der Oberklasse sein können oder nicht. Die IDE verwendet standardmäßig aber getClass().
d) Wieso nicht…
Also, wenn ich Zugang zum Wiki habe, stelle ich’s selber rein.
[QUOTE=iKnwWhtUDidLast]
Also, wenn ich Zugang zum Wiki habe, stelle ich’s selber rein.[/QUOTE]
Jeder, der hier angemeldet ist, kann im Wiki schreiben (gleicher Account).
Aber wenn, dann bitte richtig - Bleiglanz hat diesbezüglich recht, dass keiner die Zeit hat, alles zu kontrollieren/nachzubearbeiten.
Bei Fragen zum Umgang gibt es ja hier ein Forum, oder diese Hilfsseite verwenden.
Bitte Java-Tags verwenden. <code=java> blabla </code=java> und die Kategorie nicht vergessen, sonst verschwindet das Teil im Nirvana.
Ach ja… Fass dich im Titel bitte etwas kürzer.
Edit: Ich hab es verbessert (Code-Tags und Kategorien). Den Titel machst du selber kleiner.
Ja, geht auch über verschieben, ist aber so besser für ihn (glaub ich) - ach was solls. Ich machs selber - er soll mir nur sagen, wie er es nennen will. So ist mir das zu lang.