Эффективность конкатенации строк Java

Это плохо?

(представьте, что он больше)

int count;
//done something to count
String myString = "this " + "is " + "my " + "string" + "and " + this.methodCall() + " answer " + "is : " + count;

или лучше в StringBuilder/StringBuffer?


person Mark W    schedule 04.01.2012    source источник


Ответы (8)


Компилятор Java преобразует его в StringBuilder, чтобы повысить производительность повторяющейся конкатенации строк. http://java.sun.com/docs/books/jls/Third%5Fedition/html/expressions.html#15.18.1.2

Когда вы выполняете конкатенацию в цикле, компилятор не может заменить StringBuilder сам по себе, поэтому вам следует подумать о конкатенации в StringBuilder.

person user765635    schedule 04.01.2012
comment
А как насчет этой статьи? - person gaheinrichs; 13.07.2016
comment
Когда вы выполняете конкатенацию в цикле, компилятор не может заменить StringBuilder сам по себе, поэтому вам следует подумать о конкатенации в StringBuilder. - person user765635; 14.07.2016
comment
Когда вы выполняете конкатенацию в цикле, компилятор не может заменить StringBuilder сам по себе. Именно тогда вам следует подумать об переключении с конкатенации на использование StringBuilder. - person Trunk; 12.11.2017

Нет, все хорошо. Если вы используете компилятор Sun Java 6, он фактически будет использовать StringBuilder.

Прочтите эту статью< /а>

person Klas Lindbäck    schedule 04.01.2012

Javadoc для состояний StringBuffer из Java 5.0

Обычно следует использовать класс StringBuilder, а не этот, так как он поддерживает все те же операции, но быстрее, так как не выполняет синхронизацию.

Компилятор будет комбинировать строковые литералы, так что это то же самое, что писать

String myString = "this is my stringand " + this.methodCall() + " answer is : " + count;

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

String myString = new StringBuilder().append("this is my stringand ").append(methodCall()).append(" answer is : ").append(count).toString();

Я бы не беспокоился о производительности, если только вам не нужно удалять мусор из вашей системы, и в этом случае вы не будете использовать здесь строки. (Маловероятно, что вам стоит об этом беспокоиться)

person Peter Lawrey    schedule 04.01.2012

Было бы более читабельно, если бы вы использовали StringBuilder/StringBuffer (выберите в зависимости от модели потока вашего приложения)

если ты напишешь

    String str = "abc";
    str+="def";

Внутри он создаст StringBuilder для того же

   7:   invokespecial   #4; //Method java/lang/StringBuilder."<init>":()V
   10:  aload_1
   11:  invokevirtual   #5; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
   14:  ldc #6; //String def
   16:  invokevirtual   #5; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
   19:  invokevirtual   #7; //Method java/lang/StringBuilder.toString:()Ljava/lang/String;
   22:  astore_1
person jmj    schedule 04.01.2012

(представьте, что он больше)...

Объединение строк с помощью оператора «+» создает множество временных объектов и увеличивает сбор мусора. Использование класса StringBuffer более эффективно.

Подробнее здесь: http://www.ibm.com/developerworks/websphere/library/bestpractices/string_concatenation.html

StringBuffer strBuf = new StringBuffer();
strBuf.append("this");
strBuf.append("is");
strBuf.append("my");
strBuf.append("string");
strBuf.append("and");
strBuf.append(this.methodCall());
strBuf.append(" answer ");
strBuf.append("is : ");
strBuf.append(count);

Может быть связано: Конкатенация строк: оператор concat() vs +

person JohnJohnGa    schedule 04.01.2012
comment
да, но так ли это только тогда, когда вы объединяете в цикле, а не строите строку за один раз? - person Mark W; 04.01.2012
comment
В чем разница? Используйте StringBuffer, если вы делаете много конкатенаций - person JohnJohnGa; 04.01.2012
comment
Ссылка на ваш источник всегда полезна. - person Jean-François Corbett; 04.01.2012
comment
@ Jean-FrançoisCorbett, вы правы, я добавил URL. Спасибо - person JohnJohnGa; 04.01.2012
comment
Когда это находится в одном выражении, подобном этому, компилятор может оптимизировать его для вас, чтобы он не создавал промежуточные объекты String. (насколько мне известно!) - person Mark Rhodes; 04.01.2012
comment
@MarkRhodes, даже если это одно и то же, оно более читабельно и им легко манипулировать, это лучшая практика. - person JohnJohnGa; 04.01.2012
comment
Верно, но вопрос в эффективности. - person Mark Rhodes; 04.01.2012
comment
@MarkRhodes, если это то же самое (с точки зрения эффективности), используйте StringBuffer для других преимуществ :) - person JohnJohnGa; 04.01.2012
comment
Не используйте StringBuffer, если вам не нужна безопасность потоков (что сомнительно). Javadoc предлагает вам вместо этого использовать StringBuilder с 2004 года. - person Peter Lawrey; 04.01.2012

Относительно новая статья с графиком, показывающая, что конкатенация с '+' масштабируется довольно ужасно. И, как упоминалось в другом ответе, StringBuilder, вероятно, будет более читабельным.

person Per Fagrell    schedule 04.01.2012

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

Однако количество простых строк, таких как «this» и «is», не влияет на производительность, поскольку компилятор будет эффективно их обрабатывать и создавать интернированные строки, которые в конечном итоге попадут в байт-код. При этом упомянутые строки не будут иметь накладных расходов на окончательную производительность.

person ŁukaszBachman    schedule 04.01.2012

Я не думаю, что это имеет какое-либо значение для производительности, когда строка написана таким образом - компилятор все равно ее оптимизирует.

person Mark Rhodes    schedule 04.01.2012