Разница между StringBuilder и StringBuffer

1472
задан Raedwald 10 May 2016 в 08:20
поделиться

9 ответов

StringBuffer синхронизируется, StringBuilder не.

1579
ответ дан Raimund Krämer 10 May 2016 в 08:20
поделиться

StringBuffer

  • Синхронизировался следовательно ориентированный на многопотоковое исполнение
  • Ориентированный на многопотоковое исполнение следовательно медленный

StringBuilder

  • Представленный в Java 5.0
  • , Асинхронном следовательно быстрый & эффективный
  • Пользователь явно должен синхронизировать его, если он хочет
  • , можно заменить его StringBuffer без любого другого изменения
21
ответ дан AJPerez 10 May 2016 в 08:20
поделиться

StringBuilder не ориентирован на многопотоковое исполнение. Строковый Буфер. Больше информации здесь .

РЕДАКТИРОВАНИЕ: Что касается производительности, после умирает горячая точка , StringBuilder является победителем. Однако для маленьких повторений, различие в производительности незначительно.

22
ответ дан Learning 10 May 2016 в 08:20
поделиться

StringBuilder был представлен в Java 1.5, таким образом, это не будет работать с ранее JVMs.

От Javadocs:

класс StringBuilder обеспечивает API, совместимый с StringBuffer, но без гарантии синхронизации. Этот класс разработан для использования в качестве общедоступной замены для StringBuffer в местах, где строковый буфер использовался единственным потоком (поскольку обычно имеет место). Где возможно, рекомендуется, чтобы этот класс использовался в предпочтении к StringBuffer, поскольку это будет быстрее являться объектом большинства реализаций.

41
ответ дан MrTux 10 May 2016 в 08:20
поделиться

В основном StringBuffer методы синхронизируются, в то время как StringBuilder не.

операции являются "почти" тем же, но использующий синхронизированные методы в единственном потоке излишество.

Это в значительной степени об этом.

Кавычка от StringBuilder API:

Этот класс [StringBuilder] обеспечивает API, совместимый с StringBuffer, , но без гарантии синхронизации . Этот класс разработан для использования в качестве общедоступной замены для StringBuffer в местах, где строковый буфер использовался единственным потоком (поскольку обычно имеет место). Где возможно, рекомендуется, чтобы этот класс использовался в предпочтении к StringBuffer в качестве [1 114], это будет быстрее являться объектом большинства реализаций.

, Таким образом, это было сделано заменить им.

то же произошло с Vector и ArrayList.

236
ответ дан Ashish Kumar 10 May 2016 в 08:20
поделиться

StringBuffer используется для хранения строк символов, которые будут изменены (объекты String не могут быть изменены). Он автоматически расширяется по мере необходимости. Связанные классы: String, CharSequence.

StringBuilder был добавлен в Java 5. Он идентичен во всех отношениях StringBuffer, за исключением того, что он не синхронизирован, что означает, что если к нему одновременно обращаются несколько потоков, могут возникнуть проблемы. , Для однопоточных программ, наиболее распространенный случай, позволяющий избежать накладных расходов на синхронизацию, делает StringBuilder немного быстрее.

3
ответ дан 22 November 2019 в 20:15
поделиться

StringBuffer синхронизирован, но StringBuilder нет. В результате StringBuilder работает быстрее, чем StringBuffer.

.
4
ответ дан 22 November 2019 в 20:15
поделиться

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 .

714
ответ дан 22 November 2019 в 20:15
поделиться

Другие справедливо указали на основные отличия между двумя. Однако с точки зрения производительности я хотел бы добавить, что оптимизация уровня JVM "Блокирует Elision", который мог сделать различие в производительности в контексте синхронизации, чтобы почти не существовать. Превосходное чтение на этом здесь и здесь

0
ответ дан 22 November 2019 в 20:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: