Ich weiß, dass ==
es beim Vergleich von zwei Probleme gibt Strings
. Es scheint, dass dies String.equals()
ein besserer Ansatz ist. Nun, ich mache JUnit-Tests und meine Neigung ist es, sie zu verwenden assertEquals(str1, str2)
. Ist dies eine zuverlässige Methode, um zu behaupten, dass zwei Strings denselben Inhalt enthalten? Ich würde verwenden assertTrue(str1.equals(str2))
, aber dann haben Sie nicht den Vorteil zu sehen, was die erwarteten und tatsächlichen Werte bei einem Fehler sind.
Hat jemand einen Link zu einer Seite oder einem Thread, der die Probleme mit klar erklärt str1 == str2
?
Antworten:
Sie sollten immer verwenden
.equals()
beim VergleichStrings
in Java.JUnit ruft die
.equals()
Methode auf, um die Gleichheit in der Methode zu bestimmenassertEquals(Object o1, Object o2)
.Sie sind also auf jeden Fall sicher
assertEquals(string1, string2)
. (WeilString
s s sindObject
)Hier ist ein Link zu einer großartigen Stackoverflow-Frage zu einigen Unterschieden zwischen
==
und.equals()
.quelle
assertEquals
verwendet dieequals
Methode zum Vergleich. Es gibt eine andere BehauptungassertSame
, 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 wirda == b
geprüft, oba
undb
auf dasselbe Objekt verwiesen wird . Es ist in die Sprache integriert und kann von verschiedenen Klassen nicht geändert werden. Dieequals
Methode kann dagegen von Klassen überschrieben werden. Während das Standardverhalten (in derObject
Klasse) darin besteht, eine Identitätsprüfung mit dem==
Operator durchzuführenString
, überschreiben viele Klassen, einschließlich , diese, um stattdessen eine "Äquivalenz" -Prüfung durchzuführen. Im Fall vonString
, anstatt zu prüfen, oba
undb
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 wirdfalse
. Wenn ichequals
jedoch verwende,equals
liest die Methode die beiden Zettel und stellt fest, dass sie dasselbe sagen ("Foo"), und kehrt daher zurücktrue
.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 Bedienertrue
häufiger zurück als erwartet.quelle
Kurz gesagt: Sie können zwei String-Objekte haben, die dieselben Zeichen enthalten, aber unterschiedliche Objekte sind (an unterschiedlichen Speicherorten). Der Operator == überprüft, ob zwei Referenzen auf dasselbe Objekt (Speicherort) verweisen. Die Methode equals () überprüft jedoch, ob die Zeichen identisch sind.
Normalerweise möchten Sie überprüfen, ob zwei Zeichenfolgen dieselben Zeichen enthalten und nicht, ob sie auf denselben Speicherort verweisen.
quelle
quelle
Ja, es wird ständig zum Testen verwendet. Es ist sehr wahrscheinlich, dass das Testframework .equals () für solche Vergleiche verwendet.
Unten finden Sie einen Link, der den "String Equality Error" erklärt. Im Wesentlichen sind Zeichenfolgen in Java Objekte. Wenn Sie die Objektgleichheit vergleichen, werden sie normalerweise anhand der Speicheradresse und nicht anhand des Inhalts verglichen. Aus diesem Grund belegen zwei Zeichenfolgen nicht dieselbe Adresse, auch wenn ihr Inhalt identisch ist, sodass sie nicht richtig übereinstimmen, obwohl sie beim Drucken gleich aussehen.
http://blog.enrii.com/2006/03/15/java-string-equality-common-mistake/
quelle
Die JUnit
assertEquals(obj1, obj2)
ruft tatsächlich anobj1.equals(obj2)
.Es gibt auch
assertSame(obj1, obj2)
welcheobj1 == obj2
, die dies tun (dh dies überprüfenobj1
undobj2
auf dasselbe verweisen) , die dies tun Instanz ), was Sie vermeiden möchten.Also geht es dir gut.
quelle
http://leepoint.net/notes-java/data/strings/12stringcomparison.html
String
ist einObject
in Java, so fällt es in diese Kategorie von Vergleichsregeln.quelle