Java 中 String、StringBuffer、StringBuilder 的區(qū)別
核心區(qū)別概覽
| 特性 | String | StringBuffer | StringBuilder |
|---|---|---|---|
| 可變性 | 不可變 | 可變 | 可變 |
| 線程安全 | 安全(不可變) | 安全(方法加同步鎖) | 不安全 |
| 性能 | 最差(頻繁創(chuàng)建對象) | 中等 | 最好 |
| 使用場景 | 少量拼接、常量 | 多線程拼接 | 單線程拼接 |
詳細對比
1. 可變性
String 是不可變類(immutable)。每次對 String 進行修改(如 += 拼接)時,都會創(chuàng)建一個新的 String 對象,舊對象被丟棄。
String s = "";
for (int i = 0; i < 100000; i++) {
s += 'a'; // 每次循環(huán)都創(chuàng)建新對象,性能極差
}
StringBuffer 和 StringBuilder 都是可變類(mutable)。它們內部維護一個字符數(shù)組,append 操作直接修改數(shù)組內容,不會創(chuàng)建新對象。
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 100000; i++) {
sb.append('a'); // 直接修改內部數(shù)組
}
StringBuffer sf = new StringBuffer();
for (int i = 0; i < 100000; i++){
sf.append('a');
}
2. 線程安全性
String 因為不可變,天然線程安全。
StringBuffer 的關鍵方法都加了 synchronized 關鍵字,保證多線程環(huán)境下的數(shù)據(jù)一致性:
// 可以拿這個玩一下10線程搶占
public static void StringBufferPool() throws InterruptedException{
String[] aToz = new String[]{
"a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z"
};
//10線程
Runnable task = ()->{
StringBuffer sb = new StringBuffer();
for(int i=0;i<10;i++){
sb.append(aToz[(int) (Math.random()*26)]);
System.out.println(Thread.currentThread().getName()+"當前字符:"+sb.toString());
}
};
ExecutorService es = Executors.newFixedThreadPool(10);
for (int k = 0; k< 10 ;k++){
es.execute(task);
}
es.shutdown();
es.awaitTermination(100000, TimeUnit.MILLISECONDS);
}
部分結果:
pool-1-thread-2當前字符:r
pool-1-thread-10當前字符:b
pool-1-thread-10當前字符:bc
pool-1-thread-10當前字符:bcc
pool-1-thread-9當前字符:d
pool-1-thread-4當前字符:j
pool-1-thread-5當前字符:d
pool-1-thread-5當前字符:df
pool-1-thread-5當前字符:dfm
pool-1-thread-7當前字符:p
StringBuilder 沒有同步機制,線程不安全,但因此性能更高。
3. 性能對比
| 類型 | 耗時(毫秒) | 原因 |
|---|---|---|
| String | 3883 | 每次拼接創(chuàng)建新對象,GC 壓力大 |
| StringBuffer | 48 | 有同步開銷 |
| StringBuilder | 2 | 無同步開銷,性能最優(yōu) |
3883
2
48
4. 使用場景
- String:字符串內容不經(jīng)常變化的場景,如常量、少量拼接
- StringBuffer:多線程環(huán)境下的字符串拼接
- StringBuilder:單線程環(huán)境下的字符串拼接(推薦)
總結
- 單線程拼接:優(yōu)先使用
StringBuilder - 多線程拼接:使用
StringBuffer - 避免:在循環(huán)中使用
String進行大量拼接
到此這篇關于Java 中 String、StringBuffer、StringBuilder 的區(qū)別的文章就介紹到這了,更多相關Java String、StringBuffer、StringBuilder 內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
- Java字符處理之char、String、StringBuilder和StringBuffer詳解
- Java中的char、String、StringBuilder與StringBuffer全方面解析
- Java字符串四大類之String、StringBuffer、StringBuilder、StringJoiner詳解
- Java中String、StringBuffer和StringBuilder底層實現(xiàn)深入剖析
- Java中String、StringBuffer和StringBuilder的區(qū)別
- Java中StringBuilder與StringBuffer的區(qū)別
- Java中StringBuilder與StringBuffer使用及源碼解讀
- 淺析Java中StringBuffer和StringBuilder的使用
- 詳解Java中String,StringBuffer和StringBuilder的使用
- Java中String和StringBuffer及StringBuilder?有什么區(qū)別
相關文章
在Spring Boot中使用swagger-bootstrap-ui的方法
這篇文章主要介紹了在Spring Boot中使用swagger-bootstrap-ui的方法,需要的朋友可以參考下2018-01-01
Spring Boot 監(jiān)聽器Listeners詳細教程(最新整理)
SpringBoot監(jiān)聽器基于Spring事件機制,用于響應應用狀態(tài)變化,內置事件涵蓋啟動、關閉等生命周期,支持自定義事件定義,本文給大家介紹Spring Boot 監(jiān)聽器Listeners詳細教程,感興趣的朋友一起看看吧2025-07-07
SpringBoot數(shù)據(jù)脫敏的實現(xiàn)示例
數(shù)據(jù)脫敏主要應用在客戶安全數(shù)據(jù)或商業(yè)性敏感數(shù)據(jù)的情況,本文主要介紹了SpringBoot數(shù)據(jù)脫敏的實現(xiàn)示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2024-05-05
使用JDBC4.0操作XML類型的字段(保存獲取xml數(shù)據(jù))的方法
jdbc4.0最重要的特征是支持xml數(shù)據(jù)類型,接下來通過本文重點給大家介紹如何使用jdbc4.0操作xml類型的字段,對jdbc4.0 xml相關知識感興趣的朋友一起看下吧2016-08-08

