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?
Antworten
Zu viele Anzeigen?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.
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:
- Sie ist reflexiv: Für jeden Referenzwert x, der nicht null ist, sollte x.equals(x) true zurückgeben.
- 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.
- 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.
- 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.
- Für jeden Referenzwert x, der nicht null ist, sollte x.equals(null) false zurückgeben.
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.
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
- See previous answers
- Weitere Antworten anzeigen