2012-03-01 8 views
5

Czy jest jakiś sposób na sklonowanie StringBuilder? Odczytuję pliki bitami, a następnie konwertuję te bity na znaki ASCII po tym, jak zbieram znaki w konstruktorze ciągów, a gdy mam na przykład 8 znaków, wstawiam ten obiekt Konstruktora String na listę macierzy. Potem czyściłem i znowu robiłem to samo. Jednak nie mogę utworzyć nowego konstruktora ciągów z powodu pamięci i nie mogę wprowadzać zmian do tego konstruktora String, ponieważ na liście macierzy również ten konstruktor się zmienia.Jak klonować() StringBuilder

Myślę więc, że muszę sklonować tego Konstruktora Ciągów i umieścić go na liście Array. Jest tylko jeden problem. Konstruktor String nie ma clone(). Więc jakie są moje alternatywy?

Może ktoś mógłby podać kilka pomysłów, jak to zrobić, biorąc pod uwagę wydajność i pamięć.

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

„Nie mogę utworzyć nowy ciąg, ponieważ budowniczy pamięci” - sklonowanym StringBuilder użyje podobną ilość pamięci, więc w jaki sposób to ci pomoże? – DNA

+2

'new StringBuilder (oldbuilder.toString())' jest najprostszym sposobem na skopiowanie StringBuilder. Nie wyjaśniłeś dokładnie, co próbujesz osiągnąć, więc możesz być w stanie przechowywać String z StringBuilder zamiast tego. – DNA

+0

Yap zrozumiał, że i tak to nie pomoże. Więc jestem poza opcjami, ponieważ this characters.add (new StringBuilder (sb)); daje wyjątek java outOffMemory – Streetboy

Odpowiedz

14

Jeśli nie masz pamięci, aby utworzyć nowy StringBuilder, to nie mają pamięci, aby utworzyć nowy StringBuilder i klonowanie nie zmieni. Jedynym sposobem na skopiowanie StringBuilder jestlub coś podobnego.

Jeśli otrzymujesz numer OutOfMemoryException, musisz zdobyć więcej pamięci lub znaleźć inny sposób na zmniejszenie zużycia pamięci.

1

Można wyczyścić StringBuilder obiektu przez:

1.

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

2.

sb = null; 
sb = new StringBuilder(); 

na wydajność, 1. jest lepszym rozwiązaniem. Ale i tak nie możesz tego sklonować. Aby uzyskać więcej informacji o klonie zobaczyć