Demonstrieren eines Stringvergleichs mit Java

7

Ich möchte mit ein paar Codezeilen demonstrieren, dass in Java, um zwei Strings ( String ) zu vergleichen, equals() anstelle des Operators == verwendet werden muss.

Hier ist etwas, was ich versucht habe:

%Vor%

Ich habe diese Ausgabe erwartet: different strings , weil ich mit dem Test s1 == s2 tatsächlich zwei Referenzen (d. h. Adressen) anstelle des Inhalts des Objekts vergleiche.

Aber ich habe tatsächlich diese Ausgabe: same strings !

Beim Surfen im Internet habe ich festgestellt, dass einige Java-Implementierungen den obigen Code optimieren, so dass s1 und s2 tatsächlich auf die gleiche Zeichenfolge verweisen.

Nun, wie kann ich das Problem mit dem Operator == beim Vergleich von Strings (oder Objekten) in Java demonstrieren?

    
Jérôme 31.08.2010, 19:50
quelle

3 Antworten

17

Der Compiler führt in Ihrem Fall einige Optimierungen durch, so dass s1 und s2 wirklich dasselbe Objekt sind. Sie können das umgehen, indem Sie

verwenden %Vor%

Dann haben Sie zwei verschiedene Objekte mit demselben Textinhalt.

    
tangens 31.08.2010, 19:53
quelle
2
  

Nun, wie kann ich das Problem mit dem Operator == beim Vergleich von Strings (oder Objekten) in Java demonstrieren?

Hier ein Weg:

%Vor%

Seien Sie auch vorsichtig, wenn Sie primitive Wrapper vergleichen und Auto-Boxing verwenden: Integer (und Long) für Instanz-Caches (und wiederverwendet!) die Werte -128..127. Also:

%Vor%

druckt true , während:

%Vor%

druckt false !

    
Bart Kiers 31.08.2010 20:00
quelle
0

JAVA verwaltet einen String-Pool im Heap-Space, in dem nach Möglichkeit versucht wird, mehrere Referenzen für die gleichen Werte zu haben.

Hätten Sie geschrieben:

%Vor%

es hätte Ihnen die Ausgabe gegeben: "verschiedene Strings". Das Schlüsselwort "new" erstellt eine neue Objektreferenz, während die Angabe new nicht zuerst den String-Pool auf seine Existenz überprüft.

    
Mitali Jain 10.08.2015 08:03
quelle

Tags und Links