2017-02-10 3 views
0

So habe ich gelesen, dass, wenn Sie schreiben dies:Vergleicht man Strings in Java, die bereits im Speicherpool sind

String a="foo"; 
String b="foo"; 
System.out.println(a==b); 

es wird „true“ drucken, weil die erste Implementierung des Speicherpool prüft die Suche nach " foo ", es kann es nicht finden, so dass es ein neues Objekt erstellt und foo in den Speicherpool legt, dann zeigt jede zweite Zeichenfolge auf dasselbe Objekt.

und wenn Sie schreiben:

String a="foo"; 
String b=new String("foo"); 
System.out.println(a==b); 

es wird „false“ drucken, weil Sie eine Erstellung eines neuen Objekts für b zwingen, damit es es wird nicht nehmen aus dem Pool.

meine Frage ist, wenn Sie schreiben:

String a=new String("foo"); 
String b="foo"; 
System.out.println(a==b); 

warum es immer noch "false" drucken? Ich meine "a" erstellt ein neues Objekt und schaut nicht in den Speicherpool, aber b sollte in den Speicherpool schauen und das erzeugte Objekt "a" finden und darauf zeigen. Was fehlt mir hier? danke.

+0

a ist nicht in memoryPool, daher zeigen a und b auf dif-Referenzen .... –

+0

'String a = new String (" foo ");' erstellt 2 Objekte. Zuerst erzeugt es "foo", dann erzeugt es einen anderen mit "new String". – marstran

+0

Es ist einfach, Wir haben einen String-Pool für String-Zwecke und Objekt-Pool für Objekt, Sie können nicht einen String im String-Pool mit einem String-Objekt im Objekt Pool mit == direkt – PSo

Antwort

1

Wenn Sie ein neues Objekt erstellen, befindet es sich nicht im Pool.

b sollte im Speicherpool suchen und finden Sie das Objekt "a" erstellt und zeigen Sie darauf.

Es ist im Pool, aber es gibt das "foo" Objekt nicht das new String("foo") Objekt so == noch falsch ist.

Sie einen String in den Pool mit .intern() wie

setzen können
String a = "food".substring(0, 3).intern(); 
String b = "foo"; 
assert a == b; 
-1

String ein nicht zu String-Pool geht, String b tut - so sind die Referenzen anders. Deshalb wirst du falsch.

+0

Es gibt drei 'String a' Deklarationen hier. Von wem sprichst du? – EJP

0

Obwohl der allgemeine Pool normalerweise Teil des Heapspeichers ist, werden die Objekte, die über new erstellt wurden, nie in den Pool aufgenommen, da die Literale, die beim Erstellen verwendet werden, zum Pool gehören. Wenn Sie Literale vergleichen, wird das, was Sie gesagt haben, wahr sein. Nicht gegen ein Literal und ein Objekt.

1

String a="foo";

-> Prüfen Pool String, wenn String Pool keinen hat, erstellen Sie ein neues String-Objekt in String Pool

String b="foo";

-> Prüfen String-Pools, wenn String-Pool enthält Verweise auf dieses String-Objekt.

String c=new String("foo");

Es erstellen direkt ein neues String-Objekt außerhalb des String Pool, aber in Objekt-Pool (Memory).

Beim Objektpunkt sind die 2 String-Objekte identisch. Wenn Sie also .equals verwenden, um diese 2 zu vergleichen, wird "true" zurückgegeben. Wenn Sie jedoch == zum Vergleichen verwenden, vergleicht es die Referenz, die nicht auf dasselbe Objekt zeigt, so dass sie false zurückgibt.

für weitere Informationen: http://theopentutorials.com/tutorials/java/strings/string-literal-pool/

1

Sie falsch verstanden, wie der Pool funktioniert: Wenn Sie

String a = "foo"; 

das String Objekt "foo" endet im Pool nach oben nicht, weil Sie es zuerst erstellen, sondern weil Es ist ein Objekt, das auf einem Zeichenfolgenliteral basiert (eine Folge von Zeichen in doppelten Anführungszeichen). Java erstellt dieses Objekt für Sie im Konstantenpool.

Wenn Sie

String a = new String("foo"); 

das String-Objekt "foo" aus dem Pool schreiben in ein neues String Objekt kopiert wird, die nicht im Pool platziert ist.

Verwandte Themen