2016-09-21 4 views
1

Hier ist mein Code:Java: Wann werden Zeichenfolgen in den String const pool übernommen?

String s = new String("1"); // here I know that "1" is created in const pool  
String s2 = new String("1") + new String("1"); 

Does "11" in dem String-Pool erstellt sofort in diesem Code? Falls nicht, sollte ich s2.intern() aufrufen, um "11" in den String-Pool zu stellen?

-------------- udapte 22/9/2016 ---------------------

Hier ich habe mich Somethings verwirren: Beide neue Stirng ("1") und new String ("1") + new String ("1") berufen sich auf die gleiche native Methode System.arraycopy, die ich von JDK6 lernen .

Nun, warum wird "1" im String-Pool erstellt, aber "11" nicht? Macht irgendetwas Unterschiede in StringBuilder? Vielleicht Methode "append" oder ...?

Ich werde für Ihre Hilfe geschätzt werden.

Antwort

1

Aber erstellt "11" in const Pool sofort in diesem Code?

Nein. Es wird nicht im String-Konstanten-Pool erstellt. StringBuilder wird verwendet, um die beiden "1" s zusammen zu "11", die auf dem Haufen sein wird, zu verbinden.

Sollte ich s2.intern() aufrufen, um 11 auf const Pool zu setzen?

Ja. Sie sollten intern explizit aufrufen, wenn Sie 11 (GOT wollen setzen, indem 2 "1" s (und nicht die wörtliche "11") in der String-Konstanten-Pool.

+0

Vielen Dank für Ihre Antwort. StringBuilder wird schließlich toString() aufrufen und "new String (Wert, 0, count)" .So Nach der Ausführung "new String (Wert, 0, Anzahl)", "11" noch in der Haufen? – GanGan

+0

* Warum * sollte er "intern()" aufrufen, um "11" in den konstanten Pool zu setzen? – EJP

+0

@GanGan Er hat das beantwortet. – EJP

0

String s wird nicht in den gemeinsamen Pool angelegt werden. Der neue Betreiber bewirkt, dass die JVM-Speicher für den neuen Stringliteral "1" im Heap-Speicher zuzuzuteilen

String s1 = "1"; // Common pool 
String s2 = new String("1"); // heap allocated memory 

in Ihrem Beispiel:.

String s2 = new String("1") + new String("1"); 

Was Ihre Frage: https://www.ntu.edu.sg/home/ehchua/programming/java/J3d_String.html

Das Ergebnis der Verkettung von zwei Strings wird auf Heapspeicher zugewiesen.

+0

Es gibt keine Zeichenfolge s in Ihrer Antwort – Sentry

+0

wow, vielen Dank für Ihren Anteil! Was ich verwirrt ist, dass "neue String (" 1 ")" aber nicht "String s =" 1 "". Was auch immer, ich bin Ihnen so dankbar für Ihre Antwort. – GanGan

+0

@Sentry Aber da ist ein 'String s' in der Frage. – EJP