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

Я использую StringBuilder в цикле, и каждые x итераций я хочу его очистить и начать с пустого StringBuilder, но я не вижу в документах каких-либо методов, похожих на .Net StringBuilder.Clear, только delete, который кажется слишком сложным.
Итак, каков наилучший способ очистки StringBuilder в Java?

Ответ 1

Изменить Обновлено, чтобы добавить отзыв.

Так работают два способа:

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

Ответ 2

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

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

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

Ответ 3

delete не слишком сложна:

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

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

myStringBuilder.setLength(0);

Ответ 4

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

Ответ 5

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

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

Ответ 6

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

- простой способ.

Ответ 8

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

Но просто добавление составной строки ( "Hello World of + 6E9 +" earthlings. ") в буфер, скорее всего, сделает всю проблему несущественной.

И, действительно, если StringBuilder участвует в содержании, это сложный и длительный и длинный, чем простой String str = "Привет"; (nevermind 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());
    }
}

Ответ 9

Я думаю, что многие из ответов здесь могут отсутствовать в качестве метода качества, включенного в 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 используется для взаимодействия с пользователем.