Faq (fürs Wiki): Object.equals(), String.equals(), ==, equals() und Vergleich Referen


#1

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 [U]Inhalt[/U] 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 [U]überschrieben[/U] 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)

#2

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…

von
http://www.java-blog-buch.de/040311-besondere-methoden-equals-hashcode-und-tostring/
kannst du ja zumindest noch

if (obj == this) {
    return true;
}

als zweiten Test in die equals-Methode übernehmen


#3

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


#4

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


#5

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.


#6

[QUOTE=iKnwWhtUDidLast;24441]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.


#7

[MENTION=142]SlaterB[/MENTION]: ::manklatsch:popcorn:

[QUOTE=iKnwWhtUDidLast;24441]Deine Häme geht aber langsam zu weit, auch ich hatte (wenn auch nur ein Dreißigstel) Beiträge in dem anderen Forum [/QUOTE]
Böse zungen würden jetzt schreiben:
40% davon sind Gebettel nach Danke
und 50% die Rechtfertigung, warum du jetzt ein Danke verdient hast :smiley:
und zu den restlichen 10% kann man nix gutes schreiben

… aber da ich nicht böse bin schreibe ich das jetzt mal nicht :wink:


#8

Solange es/ihn niemand besser geschrieben hat, kann dieser Beitrag doch übernommen werden.

[QUOTE=Bleiglanz;24450]Und zwar weder sprachlich, noch inhaltlich in Java.[/QUOTE]

Weder… noch wird ohne Komma geschrieben, Bleiglanz. Dann verbessere bitte, was ich falsch gemacht habe.


#9

[QUOTE=iKnwWhtUDidLast;24418]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:[/QUOTE]

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:

[QUOTE=iKnwWhtUDidLast;24418](Dabei ist ausgeschlossen, dass list oder string von obj null sein könnte)[/QUOTE]

(Dabei sei sichergestellt, dass die Variablen list und string nicht null sind)

Besser?


#10

Warum postest du das hier und schreibst es nicht gleich ins Wiki?
Traust du dich nicht, oder weißt du nicht, wie es geht?


#11

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?)


#12

Und nochwas: ein Anfänger, der den Kommentar

// String pool vermeiden

versteht (und das muss er an der Stelle), der braucht den ganzen Käse nicht zu lesen


#13

[QUOTE=Jango;24498]Traust du dich nicht, oder weißt du nicht, wie es geht?[/QUOTE]

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.


#14

[QUOTE=iKnwWhtUDidLast;24547]
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.


#15

Ok, danke. Ich habe es jetzt online gestellt: http://wiki.byte-welt.net/wiki/Object.equals(),String.equals%28%29,%3D%3D,_equals%28%29_und_Vergleich_Referenz_und_Inhalt

ich bin mir nur wegen des Zitierens noch nicht sicher.


#16

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.


#17

Danke noch mal… ich habe auch noch ein, zwei Wörter eingefügt. Ich weiß nicht, wie man die Überschrift verändert, wenn möglich, mache ich das morgen…


#18

[QUOTE=iKnwWhtUDidLast;24593]Ich weiß nicht, wie man die Überschrift verändert, [/QUOTE]

Gar nicht. Inhalt kopieren, ganzen Beitrag löschen, neuen Beitrag erstellen, Inhalt einfügen.


#19

Ginge es nicht über “verschieben”?

Edit: Beiträge löschen können wir mit unseren Rechten auch glaube garnicht.


#20

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.