assertEquals
verwendet die equals
Methode zum Vergleich. Es gibt eine andere Behauptung assertSame
, die den ==
Operator verwendet.
Um zu verstehen, warum ==
nicht mit Zeichenfolgen verwendet werden sollte, müssen Sie verstehen, was ==
funktioniert: Es wird eine Identitätsprüfung durchgeführt. Das heißt, es wird a == b
geprüft, ob a
und b
auf dasselbe Objekt verwiesen wird . Es ist in die Sprache integriert und kann von verschiedenen Klassen nicht geändert werden. Die equals
Methode kann dagegen von Klassen überschrieben werden. Während das Standardverhalten (in der Object
Klasse) darin besteht, eine Identitätsprüfung mit dem ==
Operator durchzuführen String
, überschreiben viele Klassen, einschließlich , diese, um stattdessen eine "Äquivalenz" -Prüfung durchzuführen. Im Fall von String
, anstatt zu prüfen, ob a
und b
auf dasselbe Objekt verweisen,a.equals(b)
Überprüft, ob es sich bei den Objekten, auf die sie verweisen, um Zeichenfolgen handelt, die genau dieselben Zeichen enthalten.
Analogiezeit: Stellen Sie sich vor, jedes String
Objekt ist ein Stück Papier, auf dem etwas geschrieben ist. Nehmen wir an, ich habe zwei Zettel mit "Foo" und ein weiteres mit "Bar". Wenn ich die ersten beiden Zettel nehme und ==
zum Vergleichen verwende, wird sie zurückgegebenfalse
da im Wesentlichen gefragt dasselbe Zettel handelt. Es muss nicht einmal darauf achten, was auf dem Papier steht. Die Tatsache, dass ich ihm zwei Blatt Papier gebe (anstatt zweimal dasselbe), bedeutet, dass es zurückkehren wird false
. Wenn ich equals
jedoch verwende, equals
liest die Methode die beiden Zettel und stellt fest, dass sie dasselbe sagen ("Foo"), und kehrt daher zurück true
.
Das mit Strings verwirrende Bit ist, dass Java ein Konzept zum "Internieren" von Strings hat, das (effektiv) automatisch für alle String-Literale in Ihrem Code ausgeführt wird. Dies bedeutet, dass wenn Sie zwei äquivalente Zeichenfolgenliterale in Ihrem Code haben (auch wenn sie sich in verschiedenen Klassen befinden), beide tatsächlich auf dasselbe String
Objekt verweisen . Dadurch ==
kehrt der Bediener true
häufiger zurück als erwartet.