StringBuffer
синхронизируется, StringBuilder
не.
StringBuffer
StringBuilder
StringBuffer
без любого другого изменения StringBuilder не ориентирован на многопотоковое исполнение. Строковый Буфер. Больше информации здесь .
РЕДАКТИРОВАНИЕ: Что касается производительности, после умирает горячая точка , StringBuilder является победителем. Однако для маленьких повторений, различие в производительности незначительно.
StringBuilder был представлен в Java 1.5, таким образом, это не будет работать с ранее JVMs.
От Javadocs:
класс StringBuilder обеспечивает API, совместимый с StringBuffer, но без гарантии синхронизации. Этот класс разработан для использования в качестве общедоступной замены для StringBuffer в местах, где строковый буфер использовался единственным потоком (поскольку обычно имеет место). Где возможно, рекомендуется, чтобы этот класс использовался в предпочтении к StringBuffer, поскольку это будет быстрее являться объектом большинства реализаций.
В основном StringBuffer
методы синхронизируются, в то время как StringBuilder
не.
операции являются "почти" тем же, но использующий синхронизированные методы в единственном потоке излишество.
Это в значительной степени об этом.
Кавычка от StringBuilder API:
Этот класс [StringBuilder] обеспечивает API, совместимый с StringBuffer, , но без гарантии синхронизации . Этот класс разработан для использования в качестве общедоступной замены для StringBuffer в местах, где строковый буфер использовался единственным потоком (поскольку обычно имеет место). Где возможно, рекомендуется, чтобы этот класс использовался в предпочтении к StringBuffer в качестве [1 114], это будет быстрее являться объектом большинства реализаций.
, Таким образом, это было сделано заменить им.
то же произошло с Vector
и ArrayList
.
StringBuffer используется для хранения строк символов, которые будут изменены (объекты String не могут быть изменены). Он автоматически расширяется по мере необходимости. Связанные классы: String, CharSequence.
StringBuilder был добавлен в Java 5. Он идентичен во всех отношениях StringBuffer, за исключением того, что он не синхронизирован, что означает, что если к нему одновременно обращаются несколько потоков, могут возникнуть проблемы. , Для однопоточных программ, наиболее распространенный случай, позволяющий избежать накладных расходов на синхронизацию, делает StringBuilder немного быстрее.
StringBuffer
синхронизирован, но StringBuilder
нет. В результате StringBuilder
работает быстрее, чем StringBuffer
.
StringBuilder
быстрее, чем StringBuffer
, потому что он не синхронизирован
.
Вот простой тест производительности:
public class Main {
public static void main(String[] args) {
int N = 77777777;
long t;
{
StringBuffer sb = new StringBuffer();
t = System.currentTimeMillis();
for (int i = N; i --> 0 ;) {
sb.append("");
}
System.out.println(System.currentTimeMillis() - t);
}
{
StringBuilder sb = new StringBuilder();
t = System.currentTimeMillis();
for (int i = N; i > 0 ; i--) {
sb.append("");
}
System.out.println(System.currentTimeMillis() - t);
}
}
}
тестовый прогон дает числа 2241 мс
для StringBuffer
против 753 мс
для StringBuilder
.
Другие справедливо указали на основные отличия между двумя. Однако с точки зрения производительности я хотел бы добавить, что оптимизация уровня JVM "Блокирует Elision", который мог сделать различие в производительности в контексте синхронизации, чтобы почти не существовать. Превосходное чтение на этом здесь и здесь