我有一個非常基本的問題。我讀過,如果我們有一個多執行緒應用程式,那么最好使用StringBuffer. 但是如果我們有一個單執行緒應用程式,那么最好使用StringBuilder. 但是,擁有多執行緒應用程式的全部意義不就是所有執行緒都可以同時處理同一段代碼嗎?不應該是要求如果我們不希望 String 一次被所有執行緒操作,那么我們應該去 for StringBuffer,否則去 for 就可以了StringBuilder?我想了解的是對于多執行緒應用程式,為什么需要進行同步實作(如果要求沒有說明)。
uj5u.com熱心網友回復:
- StringBuffer已經“永遠”存在了。它是執行緒安全的。
- StringBuilder是“較新的”(首先在 Java 1.5 中引入)。
- 字串是不可變的。StringBuffer 和 StringBuilder 都是可變的。無論使用的StringBuffer或StringBuilder的是大大比修改原始字串更有效。
根據檔案:
https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/lang/StringBuilder.html
[StringBuilder] 是可變的字符序列。此類提供與 StringBuffer 兼容的 API,但不保證同步。此類旨在用作 StringBuffer 的替代品,用于在單個執行緒使用字串緩沖區的地方(通常是這種情況)。在可能的情況下,建議優先使用此類而不是 StringBuffer,因為在大多數實作下它會更快。
就個人而言,我總是優先使用 StringBuffer 來操作原始字串。主要是出于習慣的力量。
是的,StringBuilder 可能“更快”。或者,很有可能,它對整體“性能”幾乎沒有影響。
要記住的關鍵點:
- 如果可以使用 StringBuilder 或 StringBuffer 代替,請不要直接操作字串。
- StringBuilder 是非同步的(即不是執行緒安全的)。如果兩個執行緒碰巧同時使用 StringBuilder,結果將是不確定的。
您可能還對此感興趣:
https://www.javatpoint.com/mutable-and-immutable-in-java
什么是可變物件?
可變物件是其值可以在初始化后更改的物件。在創建物件后,我們可以更改物件的值,例如欄位和狀態。例如 Java.util.Date、StringBuilder、StringBuffer 等。
當我們對現有的可變物件進行更改時,不會創建新物件;相反,它會改變現有物件的值。這些物件的類提供了在其中進行更改的方法。
uj5u.com熱心網友回復:
不應該是要求如果我們不希望String一次被所有執行緒操作,那么我們應該去StringBuffer,否則去StringBuilder就可以了嗎?我想了解的是,對于多執行緒應用程式,為什么需要進行同步實作(如果要求沒有說明)。
是的。
很少有應用程式實際上同時修改字符序列,因此幾乎沒有理由使用StringBuffer.
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/327003.html
上一篇:在串列上同步
