2015-08-22 2 views
1

Можете ли вы объяснить мне, почему использование StringBuilder работает намного быстрее, чем просто добавление строк с «+» каждый раз? Например:Как StringBuilder эффективнее обычного «+»?

for (int i = 0; i < arr.length; i++) { 
    stringBuilder.append(arr[i]); 
} 
str = stringBuilder.toString(); 

гораздо быстрее, чем:

for (int i = 0; i < arr.length; i++) { 
    str = str + arr[i]; 
} 

Почему это происходит?

+0

Это не дубликат ... –

+1

'toString()' а не 'ToString()' заставляет меня думать, что это java, а не C#. В любом случае, пожалуйста, исправьте теги для языка, который вы описываете. 'StringBuilder' является классом и может иметь разные реализации, что дает некоторые ответы потенциально недействительными. – Rob

+0

Если это вопрос Java String, я понимаю, что конкатенация String «быстрее» с помощью оператора +, поскольку JDK/JVM оптимизируется для наиболее эффективного подхода, в последний раз, когда я смотрел, было предложено использовать StringBuilder под капот. Было высказано предположение, что если вы не конкатенируете в цикле, вы должны использовать +. По общему признанию, это было в JDK 5. – Gavin

ответ

4

StringBuilder более эффективен, чем конкатенация строк, поскольку конкатенация строк создает новую неизменяемую строку каждый раз, когда вы ее используете, а построитель строк создает single buffer для добавления символов. This page в документе C# указывает, что объект String неизменен, а объект StringBuilder является динамическим. В нем также указывается

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

Однако, по словам this article, string.Join() имеет лучший алгоритм для добавления символов в строку.

Согласно this page в документации Java, String s неизменяемы, а StringBuilder s по существу то же самое, но могут быть изменены.

Похоже, что использование конкатенации строк приводит к накладным расходам на создание новой неизменяемой строки, в то время как использование построителя строк приводит к добавлению символов в буфер. Создание и инициализация нового объекта дороже, чем добавление символа в буфер, поэтому построитель строк быстрее, как правило, является конкатенацией строк.