Frage

Ich weiß, dass == einige Probleme hat, wenn zwei Strings vergleicht. Es scheint, dass String.equals() ein besserer Ansatz ist. Nun, ich mache JUnit-Tests und meine Neigung ist assertEquals(str1, str2) zu verwenden. Ist dies eine zuverlässige Art und Weise zu behaupten, zwei Strings den gleichen Inhalt enthalten? Ich würde verwenden assertTrue(str1.equals(str2)), aber dann bekommt man nicht den Vorteil zu sehen, was die erwarteten und tatsächlichen Werte sind bei einem Fehler.

Auf einem verwandten beachten, hat jemand einen Link zu einer Seite oder Thread, der deutlich die Probleme mit str1 == str2 erklärt?

War es hilfreich?

Lösung

Sie sollten immer Verwendung .equals() beim Vergleich Strings in Java.

JUnit ruft die .equals() Methode Gleichheit bei dem Verfahren assertEquals(Object o1, Object o2) zu bestimmen.

Also, sind Sie auf jeden Fall sicher mit assertEquals(string1, string2). (Weil Strings sind Objects)

Hier ist ein Link zu einer großen Frage Stackoverflow in Bezug auf einige der Unterschiede zwischen == und .equals().

Andere Tipps

assertEquals verwendet die equals Methode zum Vergleich. Es gibt eine andere assert, assertSame, die den == Operator verwendet.

Um zu verstehen, warum == nicht mit Zeichenketten verwendet werden, sollten Sie müssen verstehen, was == tut: es tut eine Identitätsprüfung. Das heißt, a == b prüft, ob a zu sehen und b auf die gleiche Objekt beziehen . Es ist in die Sprache eingebaut, und sein Verhalten nicht durch verschiedene Klassen geändert werden. Die equals Methode, auf der anderen Seite kann durch Klassen überschrieben werden. Während sein Standardverhalten (in der Object Klasse) ist eine Identitätsprüfung mit dem == Operator, viele Klassen, einschließlich String zu tun, außer Kraft setzt sie einen „Gleichwertigkeit“ Scheck stattdessen zu tun. Im Fall von String, statt zu überprüfen, ob a und b auf das gleiche Objekt beziehen, a.equals(b) überprüft, ob die Objekte, die sie beide Strings sind verweisen, die genau die gleichen Zeichen enthalten.

Analogy Zeit: sich vorstellen, dass jedes Objekt String ein Stück Papier mit etwas darauf geschrieben ist. Sagen wir, ich habe zwei Zettel mit „Foo“ auf sie geschrieben, und eine andere mit „Bar“ auf sie. Wenn ich die ersten beiden Stücke Papier nehmen und verwende == sie vergleichen es false zurückkehren, weil es im Wesentlichen fragt „dies ist das gleiche Stück Papier?“. Es braucht nicht einmal zu schauen, was auf dem Papier geschrieben. Die Tatsache, dass ich ihm zwei Stücke Papier gebe (und nicht die gleichen zweimal) bedeutet es false zurück. Wenn ich equals verwenden, jedoch wird die equals Verfahren die zwei Stücke von Papier lesen und sehen, dass sie die gleiche Sache ( „Foo“) sagen, und so wird es true zurück.

Das Bit, das mit Strings wird verwirrend ist, dass die Java ein Konzept des „Internierung“ Strings hat, und dies ist (effektiv) auf beliebigen Zeichenkette in Ihrem Code automatisch ausgeführt. Das bedeutet, dass, wenn Sie zwei gleichwertige Stringliterale in Ihrem Code haben (auch wenn sie in verschiedenen Klassen sind) sie werden beide tatsächlich auf das gleiche String Objekt beziehen. Dies macht die == Betreiber Rückkehr true häufiger als man erwarten könnte.

Auf den Punkt gebracht - können Sie zwei String-Objekte, die die gleichen Zeichen enthalten, sind aber verschiedene Objekte (in verschiedenen Speicherplätzen). Der Operator == prüft, dass zwei Referenzen auf dasselbe Objekt (Speicherplatz) verweisen, aber die Methode equals () überprüft, ob die Charaktere sind die gleiche.

In der Regel Sie daran interessiert sind bei der Prüfung, ob zwei Strings die gleichen Zeichen enthalten, nicht, ob sie auf den gleichen Speicherstelle verweisen.

Ja, es die ganze Zeit zum Testen verwendet. Es ist sehr wahrscheinlich, dass das Test-Framework verwendet .equals () für Vergleiche wie diese.

Im Folgenden finden Sie einen Link, um die „string Gleichheit Fehler“ zu erklären. Im Wesentlichen Strings in Java sind Objekte, und wenn Sie Objekt Gleichheit vergleichen, in der Regel werden sie auf Speicheradresse verglichen basiert, und nicht nach Inhalt. Aus diesem Grunde, zwei Strings die gleiche Adresse nicht besetzen, auch wenn ihr Inhalt ist identisch, so dass sie nicht richtig passen, obwohl sie gleich aussehen, wenn gedruckt wird.

http: //blog.enrii. com / 2006/03/15 / java-string-Gleichheit-common-Fehler /

public class StringEqualityTest extends TestCase {
    public void testEquality() throws Exception {
        String a = "abcde";
        String b = new String(a);
        assertTrue(a.equals(b));
        assertFalse(a == b);
        assertEquals(a, b);
    }
}

Die JUnit assertEquals(obj1, obj2) in der Tat nicht nennen obj1.equals(obj2).

Es gibt auch assertSame(obj1, obj2) die obj1 == obj2 tut (das heißt, überprüft, ob obj1 und obj2 verweisen das gleichen Beispiel), das ist, was Sie versuchen zu vermeiden.

Sie sind also in Ordnung.

  

"Der == Operator prüft, ob zwei Objects sind genau die gleichen Object."

http://leepoint.net/notes-java/data/strings /12stringcomparison.html

String ist ein Object in Java, so dass er fällt in diese Kategorie der Vergleichsregeln.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top