2012-06-30 3 views
12

Можно создать дубликат:
String, StringBuffer, and StringBuilderГде использовать StringBuffer/StringBuilder, чем строки

Мы знаем, что String неизменны где StringBuffer/StringBuilder изменчивы. Но иногда мы путаем, что использовать в нашем коде .. Строка или StringBuffer/StringBuilder ?? Практически в нашем максимальном коде/кратком коде мы предпочитаем String, а не StringBuffer/StringBuilder.

Этот вопрос должен решить путаницу, если у вас есть какая-либо идея & Собственная причина для этого, то, пожалуйста, дайте ответ.

+0

Да, эта ссылка полезна. –

ответ

25

Ниже приведено основное различие между этими тремя наиболее часто используемыми классами.

  • объекты класса Строки неизменны, тогда как StringBuffer и объектов StringBuilder изменчивы.
  • StringBuffer синхронизирован, в то время как StringBuilder не синхронизирован.
  • Оператор конкатенации «+» встроен с использованием либо StringBuffer, либо StringBuilder.

Критерии выбор среди Строки, StringBuffer и StringBuilder

  • Если значение объекта не изменится использовать строковый класс, так как объект Строки неизменен.
  • Если значение Object может быть изменено и доступно только из одного потока , используйте StringBuilder, потому что StringBuilder несинхронизирован.
  • В случае, если значение Object может измениться и будет изменено несколькими потоками , используйте StringBuffer, потому что StringBuffer синхронизирован.
+1

** Ваши ансы полезны **, но на самом деле мы следуем этому? Я думаю, что ans ** NO ** –

1

StringBuffers являются потокобезопасными, что означает, что у них есть синхронизированные методы для управления доступом, так что только один поток может получить доступ к синхронизированному коду объекта StringBuffer за раз. Таким образом, объекты StringBuffer обычно безопасны для использования в многопоточной среде.

Доступ к StringBuilder не синхронизирован, так что он не является потокобезопасным. Не будучи синхронизированным, производительность StringBuilder может быть лучше, чем StringBuffer. Таким образом, если вы работаете в однопоточной среде, использование StringBuilder вместо StringBuffer может привести к увеличению производительности.

+2

Обратите внимание, что очень, очень редко, что два потока будут использовать один и тот же StringBuffer/StringBuilder. Никогда не испытывал этого. –

+0

Правильно :) Я согласен и спасибо за указание на это :) – verisimilitude

3

Основная идея состоит в том, что String неизменна. Поэтому, когда вы пытаетесь изменить его, создается новый объект. StringBuffer и StringBuilder являются изменяемыми. И разница в первом является потокобезопасной.

Общий подход к использованию StringBuilder заключается в анализе чего-либо, когда вы итеративно создаете объект String в безопасной среде NON.

Например, у вас есть массив чисел [1, 2, 3]. Чтобы создать объект «String1String2String3» вы можете использовать StringBuilder

StringBuilder builder = new StringBuilder(); 
foreach(Integer num : array) { 
    builder.append("String").append(num); 
} 
builder.toString(); 

Это лучше, чем просто с помощью String string = string + ("String" + num);. AFAIK, компилятор оптимизирует использование конкатенации строк в цикле для StringBuilder, но лучше использовать его вручную.

StringBuffer используется, когда у вас есть общие состояния, которые изменяются параллельными потоками.

Смежные вопросы