Как очистить или очистить StringBuilder? [дубликат]

этот вопрос уже есть ответ здесь:

Я использую StringBuilder в цикле и каждые X итераций я хочу очистить его и начать с пустого StringBuilder, но я не вижу никакого метода, подобного .NET StringBuilder.Ясно!--7--> в документации, просто удалить метод, который кажется чрезмерно сложным.

Итак, каков наилучший способ очистить StringBuilder в Java?

9 ответов


два способа работы:

  1. использовать stringBuilderObj.setLength(0).
  2. выделить новый с new StringBuilder() вместо очистки буфера.

есть в основном два варианта, используя setLength(0) для сброса StringBuilder или создания нового на каждой итерации. Оба имеют свои плюсы и минусы в зависимости от использования.

Если вы заранее знаете ожидаемую емкость StringBuilder, создание нового каждый раз должно быть таким же быстрым, как установка новой длины. Это также поможет сборщику мусора, так как каждый StringBuilder будет относительно недолговечным, и gc оптимизирован для этого.

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


delete - это не слишком сложно :

myStringBuilder.delete(0, myStringBuilder.length());

вы также можете сделать :

myStringBuilder.setLength(0);

Если вы посмотрите на исходный код StringBuilder или StringBuffer, вызов setLength () просто сбрасывает значение индекса для массива символов. IMHO с использованием метода setLength всегда будет быстрее, чем новое распределение. Они должны были назвать метод "clear" или "reset", чтобы он был более ясным.


Я буду голосовать за sb.setLength(0); не только потому, что это один вызов функции, но потому что он фактически не копирует массив в другой массив как sb.delete(0, builder.length());. Он просто заполняет оставшиеся символы равными 0 и устанавливает переменную длины в новую длину.

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


StringBuilder s = new StringBuilder();
s.append("a");
s.append("a");
// System.out.print(s); is return "aa"
s.delete(0, s.length());
System.out.print(s.length()); // is return 0

Это самый простой способ.


вы должны использовать sb.delete(0, sb.length()) или sb.setLength(0) и не создавать новый StringBuilder ().

см. этот связанный пост для производительности:лучше ли повторно использовать StringBuilder в цикле?


Я думаю, что многие из ответов здесь могут отсутствовать метод качества, включенный в StringBuilder: .delete(int start, [int] end). Я знаю, что это поздний ответ, однако, это должно быть известно (и объяснить немного более подробно).

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

StringBuilder table = new StringBuilder();

если вы выполняете цикл через метод и изменяете содержимое, используйте содержимое, а затем желание отказаться от контента, чтобы "очистить"StringBuilder для следующей итерации, вы можете удалить его содержимое, например,

table.delete(int start, int end). 

начало и конец являются индексами символов, которые вы хотите удалить. Не знаете длину в символах и хотите удалить все это?

table.delete(0, table.length());

теперь, для кикера. StringBuilders, как упоминалось ранее, возьмите много накладных расходов при частом изменении (и может вызвать проблемы безопасности в отношении резьбы); поэтому используйте StringBuffer - то же, что StringBuilder (за несколькими исключениями) - если ваш StringBuilder используется с целью взаимодействия с пользователем.


Если производительность является основной проблемой ... ирония (IMO) - это конструкции Java для форматирования текста, который идет на буфер будет гораздо более трудоемким на CPU, чем сборщик alloc/realloc/мусора ... ну, возможно, не GC в зависимости от того, сколько строителей вы создаете и отбрасываете.

но просто добавляя составную строку ("Hello World of" + 6E9 + " earthlings.") к буферу, вероятно, сделает все дело непоследовательный.

и, действительно, если StringBuilder участвует, контент сложный и длинный и длиннее, чем простой String str = "Hi"; (неважно, что Java, вероятно, использует построитель в фоновом режиме).

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

class MyLogger {
    StringBuilder strBldr = new StringBuilder(256);

    public LogMsg( String stuff ) {

        strBldr.setLength(0);

        // ... prepend status level
        strBldr.append("Info");
        // ... prepend timestamp
        strBldr.append(" " + getTimestamp());
        // ... user msg
        strBldr.append(":" + msg);

        log.write(strBldr.toString());
    }
}