2017-02-14 11 views
1

Имея следующий код:Как память распределяется со строками в Java?

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

Сколько строк созданы? Я думаю, что 103 строк создаются:

1: Строка «JAVA» в Струнный бассейне

1: Строка «JVM» также в Струнный бассейне

101: новая строка s создается каждый раз в цикле, потому что String является классом неизменяемости

+0

jit может попробовать заменить его арраистом символов до тех пор, пока s не будет использоваться для использования –

+0

@huseyintugrulbuyukisik - 1) AFAIK, это не будет ... в выпуске Java до сих пор. 2) В соответствии со строгим чтением JLS 15.18.1 компилятору JIT не разрешается это делать. –

ответ

1

При использовании оператора «+» в строке JAVA каждый раз заменяет его на StringBuilder.

Таким образом, для каждого цикла вы создаете StringBuilder, что Concat две строки (я и JVM) с помощью метода append() затем его превращает в строку с помощью toString() метода

1

Compile время строковых выражений помещаемых в строки бассейн. s = s + "JVM" не является константой постоянной времени компиляции. поэтому каждый раз он создает новый строковый объект в куче.

для получения более подробной информации см это Behavior of String literals is confusing

3

Объединение строк осуществляется с помощью класса StringBuilder (или StringBuffer) и способа его append. Преобразования строк реализуются методом toString, определяемым Object и унаследованным всеми классами Java. Дополнительные сведения о конкатенации и конвертации строк см. В разделе Гослинг, Джой и Стил, Спецификация языка Java.

В вашем случае создано 103 строки, по одному для каждого в петле и две строки Java и JVM.

+0

JLS заявляет, что конкатенация строк * может быть реализована с использованием StringBuilder. Он не утверждает, что он должен быть реализован именно так. –