Где использовать StringBuffer / StringBuilder, чем String

Возможный дубликат:
String, StringBuffer и StringBuilder

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

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

Solutions Collecting From Web of "Где использовать StringBuffer / StringBuilder, чем String"

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

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

Критерии выбора между String , StringBuffer и StringBuilder

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

Основная идея состоит в том, что 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 используется, когда у вас есть общие состояния, которые изменяются параллельными потоками.

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

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