Эффективность конкатенации строк Java - программирование
Подтвердить что ты не робот

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

Это плохо?

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

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

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

Прочтите эту статью .

Ответ 3

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();

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

Ответ 4

Это будет более удобочитаемым, если вы используете 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

Ответ 5

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

Ответ 6

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

Конкатенация строк с помощью оператора "+" создает много временных объектов и увеличивает сбор мусора. Использование класса 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 "+" Оператор

Ответ 7

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

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

Ответ 8

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