3 Stimmen

Java: Gleichheitszeichen und ==

Nehmen wir an, wir haben 2 Verweise auf Instanzen einer benutzerdefinierten Klasse, a und b in Java. Kann es jemals eine Situation geben, in der a == b aber a.equals(b) false zurückgibt?

8voto

VoteyDisciple Punkte 36203

Klar! Die Umsetzung von .equals() ist ganz der Klasse überlassen, so könnte ich schreiben:

class Foo
    public boolean equals(Object other) {
        return false;
    }
}

Es spielt keine Rolle, welche zwei Instanzen Sie angeben - sogar die gleiche Instanz zweimal - ich werde immer sagen, dass sie nicht gleich sind.

Dieses Beispiel ist zwar albern, aber es zeigt, dass man eine false ergeben sich aus .equals() für dasselbe Objekt zweimal.

Beachten Sie, dass wir hier über das sprechen, was puede passieren, nicht was devrait . Keine Klasse sollte jemals eine .equals Methode, die behauptet, dass ein Objekt nicht mit sich selbst übereinstimmt. Bei vertrauenswürdigem Code kann man davon ausgehen, dass dies nie passieren wird.

5voto

Francisco Spaeth Punkte 22663

if a == b puis a.equals(b) wahr sein sollte. Und wenn a.equals(b) dann vielleicht a == b aber nicht unbedingt.

En == Operator nur prüfen, ob beide auf dasselbe Objekt verweisen. Während equals führt eine von Ihnen implementierte Logik aus. Der letzte kann überschrieben werden, der erste ist ein Operator der Sprache, der in Java nicht überschrieben werden kann.

Referenzen

Was ist der Unterschied zwischen dem == Operator und equals()? (mit hashcode() ???)

Von java.lang.Object Dokumentation:

Die Methode equals implementiert eine Äquivalenzrelation Objektreferenzen:

  1. Sie ist reflexiv: Für jeden Referenzwert x, der nicht null ist, sollte x.equals(x) true zurückgeben.
  2. Sie ist symmetrisch: Für beliebige Referenzwerte x und y, die nicht null sind, sollte x.equals(y) nur dann true zurückgeben, wenn y.equals(x) wahr ist.
  3. Sie ist transitiv: Wenn für beliebige Referenzwerte x, y und z, die nicht Null sind, x.equals(y) true und y.equals(z) true ergibt, dann x.equals(z) sollte true zurückgeben.
  4. Sie ist konsistent: Für beliebige Referenzwerte x und y, die nicht Null sind, können mehrere Aufrufe von x.equals(y konsistent false zurück, vorausgesetzt, dass keine Informationen, die in Gleichheits Vergleiche der Objekte verwendet werden, geändert werden.
  5. Für jeden Referenzwert x, der nicht null ist, sollte x.equals(null) false zurückgeben.

4voto

Oliver Charlesworth Punkte 259497

Ja, einfach überladen equals etwas Dummes zu tun. z.B.

class Foo {
    @Override
    boolean equals(Object rhs) { return false; }
}

3voto

mikera Punkte 103423

Es ist offensichtlich möglich Code zu schreiben, der dies tut, wie andere Antworten gezeigt haben.

Sie ist aber auch immer ein logischer Fehler in den Code einfügen, da es gegen den impliziten allgemeinen Vertrag der Funktion equals() verstößt.

Ein Objekt sollte immer mit sich selbst übereinstimmen, wenn also (a==b) puis a.equals(b) devrait immer true zurück.

2voto

cdev Punkte 93

Ja, wir können die .equals Funktion, um die gewünschte Ausgabe zu erhalten. aber es gibt keinen Fall, in dem == gibt true zurück, während .equals gibt false zurück.

class s {
    int a;
}

class dev {
    public static void main(String args[]) {
        s a = new s();
        s b = new s();
        System.out.println(a == b);
        System.out.println(a.equals(b));
    }
}

Output
false
false

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X