Подтвердить что ты не робот

StringBuffer устарел?

В книге "Эффективная Ява" Джош Блох говорит, что

StringBuffer в значительной степени устарел и должен быть заменен несинхронизированная реализация 'StringBuilder'

.

Но по моему опыту, я все еще видел широкое использование класса StringBuffer. Почему класс StringBuffer устарел и почему StringBuilder предпочтительнее StringBuffer, за исключением увеличения производительности из-за несинхронизации?

4b9b3361

Ответ 1

Это устаревшее в том, что новый код на Java 1.5 обычно должен использовать StringBuilder - очень редко, что вам действительно нужно создавать строки в потокобезопасной манере, так зачем платить стоимость синхронизации?

Я подозреваю, что код, который вы видите с помощью StringBuffer, в основном попадает в ведра:

  • Написано перед Java 1.5
  • Написано для обеспечения совместимости со старыми JDK
  • Написано людьми, которые не знают о StringBuilder
  • Autogenerated с помощью инструментов, которые не знают о StringBuilder

Ответ 2

Не все читают так широко, как вы: -)

Я только полушум. Люди копируют код и шаблоны все время. Многие люди не поддерживают связь с изменениями API.

Почему StringBuffer устарел? Потому что в подавляющем большинстве случаев его синхронизированное поведение не требуется. Я не могу думать о времени, которое мне когда-либо понадобилось. Несмотря на то, что синхронизация в настоящее время не является проблемой производительности, когда-то была, нет смысла платить этот налог в сценариях, где это не нужно.

Ответ 3

Почему класс StringBuffer устарел?

Поскольку его операции синхронизированы, что добавляет служебные данные и редко бывает полезным.

Причина, по которой вы по-прежнему считаете StringBuffer широко используемой, - это просто инерция: Есть еще множество примеров примеров кода, которые никогда не обновлялись, чтобы использовать StringBuilder, и люди по-прежнему изучают устаревшие практики (а не только это) из таких источников. И даже люди, которые лучше знают, часто возвращаются к старым привычкам.

Ответ 4

Я считаю, что устаревшее преувеличение.

StringBuffer синхронизирован. StringBuilder - нет.

Во многих (возможно, большинстве) случаях вам небезразлична безопасность потоков того, что используется для создания строк. Вы должны использовать StringBuilder в этих случаях. В некоторых случаях, однако, вы вполне можете захотеть убедиться, что действия на объекте являются потокобезопасными. StringBuffer по-прежнему полезен в этих случаях.

Ответ 5

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

Использование StringBuilder вместо этого рекламирует тот факт, что вы не ожидаете доступа к перекрестным потокам.

Фактически, отправка данных по потокам должна всегда выполняться через четко определенные каналы связи в любом случае, а не просто путем обращения к синхронизированному буферу строк. Поэтому я бы рекомендовал всегда использовать другое решение, даже если a StringBuffer кажется подходящим на первый взгляд.