Сделает ли это использование StringBuilder излишним?

If I do:

StringBuilder sb = new StringBuilder();
sb.append("somestring" + "hello" + "more strings" + "last one");

Это то же самое, что:

string s = "somestring";
s + "hello" + "more strings" + "last one";

Сделает ли это бессмысленным использование построителя строк? Таким образом, необходимо использовать:

StringBuilder sb = new StringBuilder();
sb.append("somestring");
sb.append("hello");
sb.append("more strings");
sb.append("last one");

person Solid1Snake1    schedule 05.04.2012    source источник


Ответы (7)


Короткий ответ на ваш длинный вопрос - "да".

person adarshr    schedule 05.04.2012

Если это все использование вами StringBuilder в этом фрагменте кода, это действительно бессмысленно. Если вы продолжаете добавлять после первоначального вызова append, то это не полностью бессмысленно. Однако ваш последний пример имеет гораздо больше смысла, чем первые два.

Я предполагаю, что константы в вашем посте только для ясности. Если они действительно являются константами, компилятор выполнит свертывание констант, что делает первый пример эквивалентным

StringBuilder sb = new StringBuilder();
sb.append("somestringhello");
person Sergey Kalinichenko    schedule 05.04.2012
comment
Сворачивание констант не работает для вызовов методов. Однако он работает с оператором +. - person Alan Escreet; 10.04.2012
comment
@AlanEscreet Я написал ответ на первое редактирование этого вопроса, где ОП получил только две строки, а не четыре. - person Sergey Kalinichenko; 10.04.2012

StringBuilder и StringBuffer следует использовать вместо операции String "+", когда вы будете добавлять элементы несколько раз. Как в:

String s = new String();
for(int i=0; i < x; i++){
  s += i;
}

Потому что это будет преобразовано в (что-то вроде):

String s = new String();
for(int i=0; i < x; i++){
   StringBuffer sb = new StringBuffer();
   sb.append(s);
   sb.append(i)
   s = sb.toString();
}

В каждой итерации (в эквиваленте байт-кода) вы создаете StringBuffer и конвертируете его в String.

Есть много источников, но именно; это и с этим все в порядке. Я провел небольшое исследование по этому вопросу примерно в 2010 году, и мои знания по этому вопросу восходят к тому времени. Если с тех пор есть дополнительные улучшения, я об этом не знаю.

person arin    schedule 05.04.2012

Глядя на скомпилированный вывод кода, который использует StringBuilder, по сравнению с кодом, который просто объединяет строки, я обнаружил, что последние компиляторы обычно используют StringBuilder независимо от того, когда это уместно. Сказав это, обратите внимание, что в вашем первом примере вам нужно будет сказать 's = s + "hello"; чтобы поймать результат.

person Highland Mark    schedule 05.04.2012

StringBuilder изменяем, а String — нет. StringBuilder делает эти операции со строками более эффективными. Для такой небольшой работы, как ваш пример, вы, вероятно, не заметите разницы.

person evanwong    schedule 05.04.2012
comment
Это не более эффективно. Из-за свертывания констант оператор + более эффективен для констант. Компилятор не может оптимизировать вызовы методов таким образом, поэтому StringBuilder всегда будет добавляться во время выполнения. Константы, добавленные с +, будут оптимизированы в одну константу String во время компиляции. - person Alan Escreet; 10.04.2012

В первом случае фиксированный литерал будет обнаружен компилятором и будет встроен как одно значение. подобно

sb.append("somestring" + "hello" + "more strings" + "last one");

будет рассматриваться как

sb.append("somestringhellomore stringslast one");

Таким образом, он будет добавлен только один раз в StringBuilder.


Во втором случае он добавляется несколько раз.

person random.learner    schedule 05.04.2012

Согласно строковой документации, оператор + все равно преобразуется в StringBuilder.

Два основных отличия:

  1. Когда вы объединяете набор литералов, как в вашем примере. Сворачивание констант преобразует эти отдельные строки в одну строку во время компиляции, избавляя эту операцию от выполнения во время выполнения.

    "somestring" + "hello" + "more strings" + "last one" становится "somestringhellomore stringslast one"

  2. Когда вы объединяете в петлю или другую разветвленную структуру. Использование + создаст несколько экземпляров StringBuilder, которые будут использовать больше памяти и вычислительной мощности во время выполнения. (см. http://nicklothian.com/blog/2005/06/09/on-java-string-concatenation/)

person Alan Escreet    schedule 10.04.2012