2010-08-31 12 views
7

Ich möchte mit ein paar Zeilen Code, dass in Java, dass zum Vergleichen zweier Zeichenfolgen (String), müssen Sie equals() anstelle des Operators == zu demonstrieren.Demonstrieren Zeichenfolge Vergleich mit Java

Hier ist etwas, was ich versucht:

public static void main(String Args[]) { 
    String s1 = "Hello"; 
    String s2 = "Hello"; 

    if (s1 == s2) 
     System.out.println("same strings"); 
    else 
     System.out.println("different strings"); 
} 

Ich hatte erwartet, diese Ausgabe: different strings, denn mit dem Test s1 == s2 ich eigentlich bin zwei Referenzen zu vergleichen (das heißt Adressen) anstelle des Inhalts der objet.

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

Im Internet surfen Ich fand, dass einige Java-Implementierung wird den obigen Code optimieren, so dass s1 und s2wird tatsächlich die gleiche Zeichenfolge verweisen.

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

+1

Eigentlich sollten alle Java-Compiler per JLS diese Optimierung durchführen. – Darron

Antwort

17

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

String s1 = new String("Hello"); 
String s2 = new String("Hello"); 

um die Arbeit dann Sie zwei verschiedene Objekte mit demselben Textinhalt haben.

+0

danke! Ich wusste nicht, dass die Verwendung von "neu" oder nicht, wenn das Instanziieren eines Strings etwas anderes hervorbringen würde! –

2

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

hier eine Weise:

String s = "ab"; 
String t = new String("ab"); 
System.out.println(s == t); // false 

auch vorsichtig sein, wenn primitive Wrapper zu vergleichen und mit Auto-Boxen: Integer (und Long) zum Beispiel Caches (! Und wiederverwendet) werden die Werte -128. .127. Also:

Integer s = -128; 
Integer t = -128; 
System.out.println(s == t); 

druckt true, während:

Integer s = -129; 
Integer t = -129; 
System.out.println(s == t); 

druckt false!

+0

Danke. Ich wusste nichts über das Caching von Werten - 128..127. Ich bin mir nicht sicher, warum ich Java so mache, aber es ist gut zu wissen! –

+0

@ Jérôme, dies geschieht, weil die Entwickler dachten, (denke), dass diese Werte so oft verwendet wurden, dass es vorteilhaft war, nicht jedes Mal neue Instanzen dieser Werte zu erstellen. Und da sie unveränderlich sind, kann es nicht schaden, diese Instanzen * erneut zu verwenden. –

+1

Es ist ein großartiges Beispiel für Flyweight-Muster. – Vivart

0

JAVA verwaltet einen String-Pool im Heap-Speicherbereich, in dem nach Möglichkeit versucht wird, mehrere Referenzen für dieselben Werte zu verwenden.

Hatten Sie geschrieben:

String s1 = new String ("Hello"); 
    String s2 = new String ("Hello"); 

es würden Sie den Ausgang gegeben haben. „Verschiedene strings“ ‚neuen‘ Schlüsselwort erstellt einen neuen Objektverweis zwar nicht neu geben zunächst die Zeichenfolge-Pool für seine Existenz überprüfen .