2008-11-13 3 views
28

Если вам нужно использовать String.Replace(), чтобы заменить тест 50 раз, вам по существу нужно создать новую строку 50 раз. Улучшает ли StringBuilder.Replace() это более эффективно? Например, следует ли использовать StringBuilder, если я собираюсь заменить много текста, даже если я не буду добавлять какие-либо данные к нему?Является ли StringBuilder.Replace() более эффективным, чем String.Replace?

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

+3

StringBuilder.Replace должно использовать меньше памяти, но оно не будет более производительным, чем string.Replace http://www.codeproject.com/KB/cs/StringBuilder_vs_String.aspx –

ответ

29

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

5

Да, это так. String.Replace всегда создает новую строку - StringBuilder.Replace нет.

+2

Это не совсем так, посмотрите на исходный код. StringBuilder.replace() вызывает AbstractStringBuilder.replace(), который при необходимости вызывает функцию AbstractStringBuilder.expandCapacity(). AbstractStringBuilder.expandCapacity() вызывает Arrays.copyOf(), который создает новый массив символов - и это то же самое, что и создание новой строки. –

+4

@Avi: «не относится» к «' String.Replace' * always * создает новую строку », обратите внимание на акцент на« всегда ». –

8

Это зависит, если размер замены является larger than the string replaced.

StringBuilder над распределяет буфер, в то время как строка только когда-либо имеет как никогда большое количество символов в нем.

Свойство StringBuilder.Capacity - это количество символов, которое будет храниться в буфере, а StringBuilder.Length - сколько символов используется.

Обычно вы должны установить StringBuilder.Capacity для значения, большего, чем ожидаемая результирующая строка. В противном случае StringBuilder должен будет перераспределить свой буфер. Когда StringBuilder перераспределяет свой буфер, он удваивает его размер, а это значит, через пару перераспределяет это, вероятно, значительно больше, то он должен быть, по мощности по умолчанию начинается с 16

Установив значение емкости, когда вы start (например, в конструкторе) вы сохраняете перераспределение буфера StringBuilder. Вы можете использовать StringBuilder.MaxCapacity, чтобы ограничить максимальную емкость, к которой может быть добавлен StringBuilder.

+1

Строка, созданная с помощью StringBuilder, часто удерживает больше, чем количество «полезных» символов, потому что StringBuilder фактически просто содержит строку, которую он использует в качестве своего буфера. –

Смежные вопросы