Как клонировать () StringBuilder - PullRequest
5 голосов
/ 01 марта 2012

Есть ли способы, как я могу клонировать StringBuilder?Я читаю файлы по битам, а затем преобразую эти биты в символы ASCII, после чего собираю символы в String Builder, а когда у меня есть, например, 8 символов, я помещаю этот объект String Builder в список массивов.Затем я чищу его и снова делаю то же самое.Однако я не могу создать новый построитель строк из-за памяти, и я не могу вносить изменения в этот String Builder, потому что в Array List также этот строитель меняется.

Так что я думаю, что мне нужно клонировать этот String Builder и поместитьэто в список массивов.Есть только одна проблема: в String Builder нет clone ().Итак, какие у меня есть альтернативы?

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

ArrayList characters = new ArrayList ();int counter = 0;

StringBuilder sb = new StringBuilder(blockSize-1);

while (mbb.hasRemaining()) {   

char charAscii = (char)mbb.get();


    counter++;
    charCounter++;

     if (counter == blockSize){

        sb.append(charAscii);
        characters.add(sb);//sb.toString()
        sb.delete(0, sb.length());
        counter = 0;

    }else{

        sb.append(charAscii);

     }

 if(!mbb.hasRemaining()){
    characters.add(sb);
}



}
fc.close();
return characters;

Ответы [ 2 ]

17 голосов
/ 01 марта 2012

Если у вас нет памяти для создания нового StringBuilder, то у вас нет памяти для создания нового StringBuilder, и клонирование не изменит этого.Единственный реальный способ скопировать StringBuilder - это new StringBuilder(myBuilder) или что-то эквивалентное.

Если вы получаете OutOfMemoryException, вам нужно либо получить больше памяти, либо найти какой-то другой способуменьшить потребление памяти.

1 голос
/ 01 марта 2012

Вы можете очистить StringBuilder объект:

1

sb.delete(0, sb.length()) 

2

sb = null;
sb = new StringBuilder();

Для производительности 1. лучший вариант. Но вы все равно не можете его клонировать. Для получения дополнительной информации о клоне см.

...