StringBuffer устарел?
В книге "Эффективная Ява" Джош Блох говорит, что
StringBuffer в значительной степени устарел и должен быть заменен несинхронизированная реализация 'StringBuilder'
.
Но по моему опыту, я все еще видел широкое использование класса StringBuffer. Почему класс StringBuffer устарел и почему StringBuilder предпочтительнее StringBuffer, за исключением увеличения производительности из-за несинхронизации?
Ответы
Ответ 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
кажется подходящим на первый взгляд.