Może pomóc w rozważeniu historycznego kontekstu. StringBuilder
został wprowadzony w Javie 5, ponieważ uznano, że StringBuffer
nie jest dobrze dopasowany do rzeczywistych przypadków użycia.
Nowo wprowadzony model został zaprojektowany z myślą o głównym zastosowaniu, ponieważ został skonstruowany, użyty i natychmiast porzucony w czysto lokalnym kontekście. Dlatego nie zapewnia żadnej synchronizacji i nie zadaje sobie trudu zoptymalizowania rzadkiego przypadku, w którym jego metoda toString()
jest wywoływana wiele razy bez pośredniej zmiany (kiedy dzieje się to w rzeczywistości?), Zwłaszcza, że rzeczywiście , zapewnienie funkcji buforowania bez utraty przewagi wydajności bez synchronizacji wątku, jest gdzieś pomiędzy "twardym" do "niemożliwym".
Podczas StringBuilder
dokumentuje się nie wątku bezpieczne, więc wiesz niespójne rzeczy mogą się zdarzyć podczas wywoływania metody na nim jednocześnie, klasa String
jest gwarancją pewności poprzez niezmienności wątek, a więc to nie może być dozwolone, że StringBuilder
" s brak synchronizacji może powodować niespójności w już skonstruowanych łańcuchach, a niezaplanowanie tablicy między wartościami String
i StringBuilder
jest najbezpieczniejszym rozwiązaniem.
Dlaczego więc ta optymalizacja istnieje, skoro prawie nigdy nie ma korzyści w prawdziwym życiu? No cóż, ponieważ jest tam od bardzo dawna, najprawdopodobniej nawet od wersji 1.0 i nie warto nic zmieniać w klasie StringBuffer
. Jego obecność może nie mieć żadnej realnej przewagi, ale też nie ma jej usunięcia, co wymagałoby nowych testów itd. I może okazać się, że jest to space bar overheating feature dla niektórych aplikacji ...
Możesz zauważyć, że w tamtym czasie, w Javie 1 .x, podjęto wiele decyzji projektowych, które dziś mogą wydawać się dziwne.Nadużywanie klas synchronized
w klasach podstawowych jest jednym z nich, a to rzadko pomaga w optymalizacji innego. W tym czasie nawet implikacje niezmienności nie zostały dobrze zrozumiane, dlatego mamy nadmiarowe metody, takie jak String.valueOf(char[])
i String.copyValueOf(char[])
, plus możliwość użycia new String(char[])
...
Twoje pierwsze przypuszczenie jest poprawne. – Flown
@Flown Czy to się opłaca? Czy wystąpi jakikolwiek wzrost wydajności? Więcej kodu oznacza więcej błędów. – ntysdd
Jeśli wielokrotnie będziesz wywoływał 'StringBuffer :: toString', wtedy będzie korzyść. – Flown