簡體   English   中英

什么是使用StringBuffer的真實示例?

[英]What's a real-world example of using StringBuffer?

我正在使用Java 6。

我只寫了幾個多線程應用程序,所以我從來沒有遇到過多個線程訪問同一個StringBuffer的時候。

當StringBuffer可能有用時,有人會給我一個真實世界的例子嗎?

謝謝。

編輯:對不起我覺得我不夠清楚。 我總是使用StringBuilder,因為在我的應用程序中,一次只有一個線程訪問字符串。 所以我想知道什么樣的場景需要多個線程同時訪問StringBuffer。

我能想到的唯一現實世界的例子是,如果你的目標是Java版本的1.5。 StringBuilder類是在1.5中引入的,因此對於舊版本,您必須使用StringBuffer

在大多數其他情況下,出於性能原因, StringBuilder應首選StringBuffer - 很少需要StringBuffer提供的額外線程安全性。 我想不出StringBuffer更有意義的任何明顯情況。 也許有一些,但我現在想不到一個。

事實上,即使是Java庫作者也承認StringBuffer是一個錯誤

圖書館團隊評估:

根據設計,StringBuffer和StringBuilder不共享公共超類型。 它們不是替代品:一個是錯誤(StringBuffer),另一個(StringBuilder)是它的替代品。

如果已將StringBuilder添加到庫中,則可能永遠不會添加StringBuffer 如果您處於附加到同一字符串的多個線程似乎是個好主意的情況下,您可以通過同步對StringBuilder訪問來輕松獲得線程安全性。 沒有必要增加一個額外的課程以及它造成的所有混亂。

值得注意的是,受Java庫強烈啟發的.NET基類庫有一個StringBuilder類但沒有StringBuffer ,我從未見過有人抱怨過這個問題。

當您擁有一個日志文件並且多個線程正在記錄錯誤或警告並寫入該日志文件時,一個簡單的案例就是。

通常,在動態構建字符串時,這些類型的緩沖字符串對象非常有用。 它們嘗試最小化在連續追加固定大小的字符串時創建的內存分配和釋放的數量。

這是一個真實世界的例子,假設您正在手動為頁面構建HTML,您可以在其中執行大約100個字符串追加。 如果使用不可變字符串執行此操作,JAVA虛擬機將執行相當多的內存分配和釋放,使用StringBuffer可以做得更少。

StringBuffer是程序員非常喜歡的選擇。

它具有優於標准String對象的優點,因為它不是不可變對象。 因此,如果將值附加到StringBuffer,則不會創建新對象(與String一樣),而只是附加到末尾。

這使StringBuffers(在某些情況下無法由編譯器補償)具有性能優勢。

我傾向於在任何可以動態地將數據添加到字符串輸出的地方使用StringBuffers,例如日志文件編寫器或其他文件生成。

另一種選擇是StringBuilder。 但是,這不是線程安全的,因為它不是為了在單線程應用程序中提供更好的性能。 除了在StringBuffer中包含sychronized關鍵字的方法簽名之外,這些類幾乎相同。

在單線程應用程序中,建議使用StringBuilder而不是StringBuffer,因為性能提升(或者如果你反過來看,由於StringBuffer的性能開銷)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM