2015-06-15 21 views
5
String a = "abc"; 

Dies erstellt Literal "abc" in String-Pool.Wie Zeichenketten in Java behandelt werden

String b = "abc"; 

Kein neues Literal wird erstellt. b wird auf die bestehende "abc" verwiesen.

String c = new String("abc"); 

Nun wird das Objekt im Heap erstellt und c auf dem Heap hingewiesen. Das Literal wird auch im String-Pool erstellt.

Aber was passiert, wenn der Pool bereits das Literal "abc" hat? Wird es doppelte Literale im Pool geben?

Antwort

6

Aber was passiert, wenn der Pool bereits die wörtliche "abc" hat? Wird es doppelte Literale im Pool geben?

Nein.

String c = new String("abc"); 

ist semantisch äquivalent zu

String tmp = "abc"; 
String c = new String(tmp); 

Damit sollte klar sein, dass kein zusätzlicher Eintrag in der Zeichenfolge-Pool wird gerade erstellt, da die wörtliche als Argument an die Zeichenfolgenkonstruktor verwendet wird.

Sie haben recht, dass new String(...) eine Zeichenfolge auf dem Heap erstellt. Wenn Sie also sowohl den Heap- als auch den Stringpool betrachten, werden mehrere Objekte "abc", aber nicht mehr als eins im Zeichenfolgenpool sein.

[...] Das ist, wenn wir String-Literale verwenden. Wird das Literal im String-Pool wiederverwendet, wenn wir String a = new String("abc"); angeben?

Ja, das String-Pool-Literal wird wiederverwendet, wenn Sie dem Konstruktor "abc" als Argument übergeben. Das resultierende String-Objekt befindet sich jedoch nicht im Pool, sondern auf dem Heap.

+0

'String c = new String ("foo"); 'erstellt einen String in Heap und nicht im Pool, wenn Sie' intern() 'aufrufen, dann wird es ein Teil des Pools sein – silentprogrammer

+2

Ich habe nie das Gegenteil gesagt. Anstatt dies als Kommentar zu mehreren vorhandenen Antworten zu veröffentlichen, schlage ich vor, dass Sie eine eigene Antwort posten. (Während "intern()" mit Strings und dem String-Pool verwandt ist, sehe ich nicht, wie es für diese spezielle Frage relevant ist.) – aioobe

3

Aber was passiert, wenn der Pool bereits das Literal "abc" hat?

Es wird einfach wiederverwendet.

Wenn Sie irgendwo String x = "abc"; und woanders String y = "abc"; dann x == y immer true. Dies beweist, dass das Literal tatsächlich wiederverwendet wird.

+1

ok ... Das ist, wenn wir Stringliterale. Aber wird das Literal im String Pool wiederverwendet, wenn wir geben, String a = new String ("abc"); –

0

Es gibt keinen doppelten Eintrag im String-Pool, er wird von einer anderen Referenz wiederverwendet.

String s1="foo"; literal wird in Pool gehen und s1 wird beziehen.

String s2="foo"; Dieses Mal wird es prüfen, dass "foo" Literal bereits in StringPool verfügbar ist oder nicht, wie es jetzt existiert, damit s2 das gleiche Literal referenziert.

String s3=new String("foo"); 

„foo“, durch String arg Konstruktor String-Objekt wird in dem Heap neu aufgrund der Objekterstellung durch Betreiber erstellt das heißt „foo“ werden dann s3 es verweisen.

String interning using inter() method 

Java standardmäßig nicht gesetzt all String-Objekt nicht in String-Pool, anstatt sie Ihnen Flexibilität gibt explizit in String-Pool jedes beliebiges Objekt zu speichern. Sie können jedes Objekt durch in den String-Pool setzen, indem Sie die Methode intern() der Klasse java.lang.String aufrufen. Wenn Sie jedoch mit String-Literal-Notation von Java erstellen, wird automatisch intern() -Methode aufgerufen, um dieses Objekt in den String-Pool einzufügen, vorausgesetzt, es war nicht bereits im Pool vorhanden.

+2

'String s3 = neuer String (" foo ");' erstellt einen String im Heap und nicht im Pool, wenn Sie 'intern()' aufrufen, dann wird es ein Teil des Pools sein – silentprogrammer

+0

@singhakash korrigiert –

0

Die Stringliteral "abc" ist bereits im String-Pool, bevor jeder dieser Code ausgeführt wird. Es wird dort vom Compiler und Classloader platziert. Es passiert nicht während der Ausführung dieses Codes.

0
String c = new String("abc"); 

Nun wird das Objekt im Heap erstellt und c auf dem Heap hingewiesen. Das Literal wird auch im String-Pool erstellt.

Der Literalwert wird nicht in den Stringpool erstellt. Es bleibt nur im Heap. Siehe dieses Bild.

http://www.journaldev.com/797/what-is-java-string-pool

Aber was passiert, wenn der Pool bereits die wörtliche "abc" hat? Will gibt es doppelte Literale im Pool?

Im Pool können keine doppelten Werte vorhanden sein. Als Strings sind unveränderliche Objekte in Java. Siehe die zweite Antwort in diesem Post von roger_that.

String is immutable. What exactly is the meaning?

Verwandte Themen