2010-12-12 2 views
2

Я использую Java 6.Что такое реальный пример использования StringBuffer?

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

Может ли кто-нибудь дать мне пример реального мира, когда StringBuffer может быть полезен?

Спасибо.

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

ответ

8

Единственный пример в реальном мире, о котором я могу думать, это то, что вы нацеливаете Java-версии befere 1.5. Класс StringBuilder был введен в 1.5, поэтому для более старых версий вместо этого вы должны использовать StringBuffer.

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

В самом деле, кажется, что даже авторы библиотеки Java признают, что StringBuffer был mistake:

Оценка командой библиотек:

Это дизайн, что StringBuffer и StringBuilder не разделяют никакого общего населения супертип. Они не предназначены для альтернатив: является ошибкой (StringBuffer), а другая (StringBuilder) является его заменой.

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

Возможно, также стоит отметить, что библиотека базового класса .NET, которая сильно вдохновлена ​​библиотеками Java, имеет класс StringBuilder, но не StringBuffer, и я никогда не видел, чтобы кто-то жаловался на это.

0

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

Итак, пример реального мира, представьте, что вы вручную создаете HTML для страницы, где вы делаете примерно 100 строк. Если вы сделали это с неизменяемыми строками, виртуальная машина JAVA сделала бы довольно много выделения памяти и освобождения, где с помощью StringBuffer это сделало бы намного меньше.

0

StringBuffer - очень популярный выбор с программистами.

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

Это дает StringBuffers (при определенных ситуациях, которые не могут быть компенсированы компилятором) преимущество производительности.

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

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

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

+0

Я думаю, что это должно быть «StringBuffer WAS очень популярный выбор с программистами», пока не был введен StringBuilder :) –

2

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

+0

(Этот SO? Был недавно обновлен из связанного потока.) Я собирался использовать это в качестве примера также, но очень мало ситуаций, когда использование «базового типа» или аналогичного непосредственно из библиотеки Java для представления логической функции в коде было для меня хорошей идеей. Всегда приходит время, скорее, а не позже, когда вам нужно добавить к нему функцию или нужно дифференцировать (посредством компилятора/IDE) между логической функцией и тем же типом, который используется для чего-то другого. Выделенные классы для индекса auto-inc DB - это слишком много работы, но не исключение. –

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