2017-02-14 1 views
1

Mit dem folgenden Code:Wie ist Speicher mit Strings in Java verknüpft?

String s="JAVA"; 
for(i=0; i<=100; i++) 
    s=s+"JVM"; 

Wie viele Strings erstellt werden? Meine Vermutung ist, dass 103 Strings erstellt:

1: Der String "JAVA" im String Pool

1: Der String "JVM" auch im String Pool

101: Der neue String s wird jedes Mal in der Schleife erstellt, da der String eine unveränderliche Klasse ist

+0

jit kann versuchen, es durch eine arraylist von chars zu ersetzen, bis s für gebrauchte verwendet wird –

+0

@huseyintugrulbuyukisik - 1) AFAIK, wird es nicht ... in einer Version von Java bisher. 2) Nach einer strengen Lektüre von JLS 15.18.1 darf der JIT-Compiler das nicht tun. –

Antwort

1

Wenn Sie den Operator '+' für Zeichenfolge verwenden, ersetzen Sie JAVA jedes Mal durch einen StringBuilder.

So für jede Schleife erstellen Sie eine StringBuilder, die die beiden Strings verketten (s und JVM) mit dem Verfahren append() dann seine in einen String durch das Verfahren toString() umgewandelt

1

Compile-Zeit-String Ausdrücke in den String gesetzt werden Schwimmbad. s = s + "JVM" ist kein kompilierbarer Konstantenausdruck. Also jedes Mal, wenn es ein neues String-Objekt in Heap erstellt.

für weitere Details zu sehen dies Behavior of String literals is confusing

3

String Verkettung durch die StringBuilder (oder StringBuffer) Klasse und ihre append Verfahren umgesetzt wird. String-Konvertierungen werden über die Methode toString implementiert, die durch Object definiert und von allen Klassen in Java übernommen wird. Weitere Informationen zur Zeichenfolgenverkettung und -konvertierung finden Sie unter Gosling, Joy und Steele, Die Java-Sprachspezifikation.

In Ihrem Fall werden 103 Strings erstellt, jeweils einer für die Schleife und die beiden Strings Java und JVM.

+0

Die JLS gibt an, dass String-Verkettung * mit StringBuilder * implementiert werden kann. Es besagt nicht, dass es so umgesetzt werden muss. –