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





Да, это так. String.Replace всегда создает новую строку, а StringBuilder.Replace - нет.
Это не совсем так, посмотрите исходный код. StringBuilder.replace () вызывает AbstractStringBuilder.replace (), который при необходимости вызывает AbstractStringBuilder.expandCapacity (). AbstractStringBuilder.expandCapacity () вызывает Arrays.copyOf (), который создает новый массив символов - и это то же самое, что и создание новой строки.
@Avi: «не» относится к «String.Replaceвсегда создает новую строку», обратите внимание на акцент на «всегда».
Это именно тот тип вещей, для которого предназначен StringBuilder - повторная модификация одного и того же текстового объекта - это не только для повторяющейся конкатенации, хотя, похоже, это то, для чего он используется чаще всего.
Возможно, это более эффективно, но это также медленнее, AFAICT.
Это зависит от размера замены больше, чем заменяемая строка.
StringBuilder сверх выделяет свой буфер, тогда как строка всегда содержит только количество символов в ней.
Свойство StringBuilder.Capacity указывает, сколько символов будет содержать буфер, а StringBuilder.Length - сколько символов используется.
Обычно вы должны установить StringBuilder.Capacity на значение, большее, чем ожидаемая результирующая строка. В противном случае StringBuilder потребуется перераспределить свой буфер. Когда StringBuilder перераспределяет свой буфер, он удваивает его размер., что означает, что после того, как пара перераспределит память, она, вероятно, будет значительно больше, чем должна быть, по умолчанию емкость начинается с 16.
Устанавливая значение емкости при запуске (например, в конструкторе), вы сохраняете перераспределение буфера StringBuilder. Вы можете использовать StringBuilder.MaxCapacity для ограничения максимальной емкости, до которой может быть расширен StringBuilder.
Строка, созданная с помощью StringBuilder, часто также может содержать больше, чем количество «полезных» символов, потому что StringBuilder фактически просто содержит строку, которую он использует в качестве своего буфера.
StringBuilder.Replace должен использовать меньше памяти, но он не будет более производительным, чем string.Replace codeproject.com/KB/cs/StringBuilder_vs_String.aspx