Jak wyczyścić bufor łańcuchowy w Javie po pętli, aby następna iteracja używała czystego bufora ciągów?Czyszczenie bufora ciągów/budowania po pętli
Odpowiedz
Jedną z opcji jest użycie metody usuwania następująco:
StringBuffer sb = new StringBuffer();
for (int n = 0; n < 10; n++) {
sb.append("a");
// This will clear the buffer
sb.delete(0, sb.length());
}
Inną opcją (nieco czystsze) wykorzystuje setLength (int len):
sb.setLength(0);
Zobacz Javadoc o więcej informacji:
Coś nieco mniej śmieci byłoby po prostu zadeklarować StringBuffer wewnątrz pętli. –
Ah, myślę, że sb.setLength (0); jest czystszy i bardziej wydajny niż deklarowanie go w pętli. Twoje rozwiązanie jest sprzeczne z korzyściami płynącymi z używania StringBuffer ... – Jon
Myślę, że korzyści związane z wydajnością wynikają z możliwości zmiany łańcucha znaków, a nie z zapisywania instancji. oto krótki test iteracji 1e8: pętla wewnętrzna (2.97s): http://ideone.com/uyyTL14w, pętla zewnętrzna (2,87s): http://ideone.com/F9lgsIxh –
buf.delete(0, buf.length());
Proponuję kreatynę g nowy StringBuffer
(lub jeszcze lepiej, StringBuilder
) dla każdej iteracji. Różnica w wydajności jest naprawdę znikoma, ale twój kod będzie krótszy i prostszy.
Ponieważ java jest obecnie najczęściej używana na Androidzie, nie jestem pewien, czy przydzielenie nowego obiektu w pętli jest dobrą praktyką dla wydajności i żywotności baterii. Złożoność kodu dodana przez wyczyszczenie 'StringBuilder' jest minimalna w porównaniu do potencjalnego przyrostu wydajności. –
Jeśli masz jakiekolwiek dowody takiej różnicy w wydajności, udostępnij je. (Będę również zadowolony, gdy zobaczysz statystyki miejsc, w których Java jest najczęściej używana i pod jaką definicją "głównie".) –
Dobrze wiadomo, że alokacja (nowe słowo kluczowe w Javie) jest droższa niż zmiana niektórych pól tego samego obiekt. W przypadku "przeważnie", z którym można się bardzo dobrze wymieniać, istnieje ponad 1,5 miliarda urządzeń z Androidem, wszystkie wykorzystują Javę. –
Najprostszym sposobem na ponowne wykorzystanie StringBuffer
jest użycie metody setLength()
public void setLength(int newLength)
może mieć sprawę jak
StringBuffer sb = new StringBuffer("HelloWorld");
// after many iterations and manipulations
sb.setLength(0);
// reuse sb
@MMahmoud, W przykładowym kodzie powinien odczytać 'setLength' zamiast' setlength'. – OnaBai
StringBuffer sb = new SringBuffer();
// do something wiht it
sb = new StringBuffer();
myślę, że ten kod jest szybciej.
To będzie miało problemy z wydajnością. Tworzy nowy obiekt po każdej iteracji. –
@AdityaSingh Jest to całkowicie rozsądne podejście. Nie zakładaj problemów z wydajnością bez dowodów. – shmosel
Masz dwie opcje:
użyć:
sb.setLength(0); // It will just discard the previous data, which will be garbage collected later.
lub użyj:
sb.delete(0, sb.length()); // A bit slower as it is used to delete sub sequence.
UWAGA
Unikaj deklarowania StringBuffer
lub StringBuilder
obiektów wewnątrz pętli innego to będzie tworzyć nowe obiekty przy każdej iteracji. Tworzenie obiektów wymaga zasobów systemowych, przestrzeni, a także zabiera czas. Dlatego na dłuższą metę unikaj deklarowania ich w pętli, jeśli to możliwe.
Już dobra odpowiedź tam. Wystarczy dodać wynik testu wydajności dla StringBuffer i różnicę wydajności StringBuild użyć nowej instancji w pętli lub użyć pętli setLength (0).
Podsumowanie brzmi: W dużej pętli
- StringBuilder jest znacznie szybsze niż StringBuffer
- Tworzenie nowej instancji StringBuilder w pętli nie mają różnicę setlength (0). (Setlength (0) posiadają bardzo bardzo małe korzyści nie tworzyć nową instancję).
- StringBuffer jest mniejsza niż StringBuilder przez tworzenie nowych wystąpienie w pętli
- setLength (0) o StringBuffer jest bardzo wolniej niż tworzyć nową instancję w pętli.
Bardzo proste odniesienia (po prostu ręcznie zmieniony kod i zrobić inny test):
public class StringBuilderSpeed {
public static final char ch[] = new char[]{'a','b','c','d','e','f','g','h','i'};
public static void main(String a[]){
int loopTime = 99999999;
long startTime = System.currentTimeMillis();
StringBuilder sb = new StringBuilder();
for(int i = 0 ; i < loopTime; i++){
for(char c : ch){
sb.append(c);
}
sb.setLength(0);
}
long endTime = System.currentTimeMillis();
System.out.println("Time cost: " + (endTime - startTime));
}
}
New StringBuilder instancja w pętli: koszt Czas: 3693, 3862, 3624, 3742
StringBuilder setlength: Czas koszt: 3465, 3421, 3557, 3408
New StringBuffer instancja w pętli: Czas Koszt: 8327, 8324, 8284
StringBuffer setlength Czas koszt: 22878, 23017, 22894
Ponownie StringBuilder setlength aby zapewnić nie moja labtop dostałem jakiś problem używać takich długo StringBuffer setlength :-) kosztów Czas: 3448
public void clear(StringBuilder s) {
s.setLength(0);
}
Zastosowanie:
StringBuilder v = new StringBuilder();
clear(v);
dla czytelności, myślę, że jest to najlepsze rozwiązanie.
- 1. Czyszczenie po konflikcie git merge?
- 2. Jak wykonać czyszczenie po SIGKILL?
- 3. Czyszczenie po przeprowadzeniu wszystkich testów
- 4. Czyszczenie ByteBuffer
- 5. Zachowywanie zawartości bufora po eglSwapBuffers
- 6. Testowanie spocków: czyszczenie po zakończeniach bloku "where:"
- 7. CakePHP: Czyszczenie pola hasła po nieudanym przesłaniu
- 8. Unikanie powtórzenia kodu po pętli?
- 9. Automatyczne czyszczenie dla TortoiseSVN
- 10. czyszczenie zagnieżdżonych płaszczyzn
- 11. ASP.NET MVC: czyszczenie TempData po wykonaniu metody kontrolera
- 12. typ wejścia = "plik", czyszczenie pliku po kliknięciu Anuluj w chrome
- 13. datownik jQuery UI - czyszczenie altField po wyczyszczeniu pola podstawowego
- 14. Qt - Czyszczenie zawartości QTableView
- 15. Czy python oficjalnie obsługuje ponowne użycie zmiennej pętli po pętli?
- 16. Co to jest zmienna pętli po pętli w Delphi?
- 17. Jquery dla pętli pisać html po co trzeciej iteracji pętli
- 18. czyszczenie zmienne $ _POST
- 19. Czyszczenie responsywnego cyklu jQuery
- 20. Czyszczenie pamięci podręcznej ActiveRecord
- 21. Czyszczenie przed zamknięciem QCoreApplication
- 22. czyszczenie tablicy znaków c
- 23. Czyszczenie obiektu @RequestScoped?
- 24. Czyszczenie plików TestResults ReSharper's?
- 25. Czyszczenie ekranu terminala?
- 26. Czyszczenie ekranu w IPython
- 27. Czyszczenie multilinii EditText
- 28. Git: automatyczne czyszczenie?
- 29. Czyszczenie funkcji Clojure
- 30. Czyszczenie katalogu kompilacji w setup.py
Kolejne pytanie: dlaczego używasz SB tylko dla jednej iteracji pętli? Czy jest kolejna wewnętrzna iteracja? SB nie jest warta, jeśli po prostu chcesz zrobić A + B + C + D (kompilator Java będzie wewnętrznie używać SB). Pomaga, jeśli chcesz warunkowo dodać części ciągów, ale poza tym ... po prostu użyj "+". – helios
You madarchod conajmniej zaakceptować odpowiedź –