在Java中,String
、StringBuilder
?和?StringBuffer
?都用于處理字符串,但它們在可變性、線程安全性和性能上有顯著區別。以下是它們的對比:
1.?String
- 不可變性(Immutable)
String
?對象一旦創建,內容不可修改。任何修改操作(如拼接、替換)都會生成新的?String
?對象。java
String s = "hello";
s += " world"; // 創建新對象,原對象"hello"不變
- 線程安全
由于不可變,String
?是線程安全的。 - 性能問題
頻繁修改字符串(如循環拼接)會產生大量臨時對象,影響性能。
2.?StringBuilder
- 可變性(Mutable)
StringBuilder
?的內容可以修改,直接在原對象上操作,不會創建新對象。java
StringBuilder sb = new StringBuilder("hello");
sb.append(" world"); // 直接修改原對象
- 非線程安全
方法未加同步鎖,多線程環境下不安全。 - 高性能
適合單線程下的頻繁字符串操作(如循環拼接)。
3.?StringBuffer
- 可變性(Mutable)
與?StringBuilder
?類似,內容可修改。java
StringBuffer sb = new StringBuffer("hello");
sb.append(" world"); // 直接修改原對象
- 線程安全
方法通過?synchronized
?加鎖,保證多線程安全,但性能略低。 - 適用場景
需要線程安全的字符串操作(如全局共享的字符串緩沖區)。
對比總結
特性 | String | StringBuilder | StringBuffer |
---|---|---|---|
可變性 | 不可變 | 可變 | 可變 |
線程安全 | 是 | 否 | 是 |
性能 | 低(頻繁修改) | 高(單線程) | 較低(線程安全開銷) |
適用場景 | 字符串常量 | 單線程頻繁修改 | 多線程字符串操作 |
如何選擇?
- 優先用?
String
:字符串內容不變化或初始化后不再修改時(如配置信息)。 - 單線程頻繁修改:用?
StringBuilder
(如循環拼接字符串)。 - 多線程環境:用?
StringBuffer
(或通過局部變量避免共享)。
示例代碼
java
// String 拼接(產生多個對象) |
String s = "a"; |
for (int i = 0; i < 10; i++) { |
s += "b"; // 每次循環創建新對象 |
} |
// StringBuilder(高效單線程拼接) |
StringBuilder sb = new StringBuilder("a"); |
for (int i = 0; i < 10; i++) { |
sb.append("b"); // 直接修改原對象 |
} |
// StringBuffer(線程安全拼接) |
StringBuffer sbf = new StringBuffer("a"); |
synchronized(sbf) { // 手動同步(非必須,append本身是線程安全的) |
sbf.append("b"); |
} |
理解這些區別有助于根據場景選擇最優的字符串處理方式。