最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java中String、StringBuffer和StringBuilder底層實現(xiàn)深入剖析

 更新時間:2026年01月08日 10:22:03   作者:Ricky_Ribbon  
在Java編程語言中String、StringBuffer和StringBuilder都是用來處理字符串的類,但它們之間存在顯著的性能和功能差異,這篇文章主要介紹了Java中String、StringBuffer和StringBuilder底層實現(xiàn)的相關(guān)資料,需要的朋友可以參考下

前言

這三個類都是 java.lang 包下的字符串處理類,但它們在設(shè)計理念、內(nèi)部實現(xiàn)和適用場景上存在顯著差異。

1. 全面對比表

比較維度StringStringBufferStringBuilder
可變性不可變(Immutable)
內(nèi)容一旦創(chuàng)建無法修改
可變(Mutable)
支持原地修改
可變(Mutable)
支持原地修改
線程安全天然線程安全(不可變對象)線程安全
關(guān)鍵方法(如 append、insert)加了 synchronized
非線程安全
無任何同步機制
性能修改操作最慢(頻繁創(chuàng)建新對象)中等(有鎖開銷,但比 String 好)最高(無鎖,單線程下最優(yōu))
內(nèi)部存儲底層是 final char[] value(JDK 7+)
JDK 8 前是 char[],不可擴容
底層是 char[] value,可動態(tài)擴容底層是 char[] value,可動態(tài)擴容(實現(xiàn)幾乎相同)
容量擴容機制無(固定長度)默認(rèn)容量 16,擴容時新容量 = (舊容量 * 2) + 2同 StringBuffer:默認(rèn) 16,擴容時新容量 = (舊容量 * 2) + 2
內(nèi)存占用每次修改產(chǎn)生新對象 + 新 char[],GC 壓力大共享同一 char[],內(nèi)存高效同 StringBuffer,內(nèi)存高效
字符串常量池支持常量池緩存(字面量可復(fù)用)不支持常量池不支持常量池
引入版本JDK 1.0JDK 1.0JDK 1.5(為單線程優(yōu)化而新增)
繼承關(guān)系繼承 AbstractStringBuilder,實現(xiàn) CharSequence、Serializable、Comparable繼承 AbstractStringBuilder,實現(xiàn) Appendable 等繼承 AbstractStringBuilder,實現(xiàn) Appendable 等
方法同步無需同步大部分修改方法(如 append、delete)都是 synchronized無 synchronized
典型使用場景常量字符串、鍵值存儲、配置信息多線程頻繁拼接(如日志記錄、共享緩沖)單線程頻繁拼接(如 JSON 構(gòu)建、循環(huán)拼接)——現(xiàn)代項目首選
toString() 實現(xiàn)返回自身(緩存優(yōu)化 JDK 7+)新建 String 對象(調(diào)用 Arrays.copyOf)同 StringBuffer

2. 底層實現(xiàn)深入剖析

  • String 的不可變性

    // JDK 源碼簡化版
    public final class String {
        private final char[] value;  // final 修飾,不可重新賦值
        private final int hash;      // 緩存 hashCode
    }
    

    任何“修改”操作(如 concat、replace)都會 new String() 并復(fù)制 char[],原對象不變。

  • StringBuffer / StringBuilder 的可變性
    兩者都繼承自 AbstractStringBuilder

    abstract class AbstractStringBuilder {
        char[] value;      // 非 final,可擴容
        int count;         // 當(dāng)前長度
    }
    
    • append 等操作直接操作 value 數(shù)組。
    • 擴容時:Arrays.copyOf 創(chuàng)建更大數(shù)組,復(fù)制舊內(nèi)容。

    關(guān)鍵區(qū)別:StringBuffer 的公共方法加了 synchronized

    // StringBuffer 示例
    public synchronized StringBuffer append(String str) { ... }
    
    // StringBuilder 示例
    public StringBuilder append(String str) { ... }  // 無 synchronized
    

3. 性能對比實測(循環(huán) 10 萬次拼接)

public class Test {
    public static void main(String[] args) {
        int times = 100000;

        // String
        long start = System.nanoTime();
        String s = "";
        for (int i = 0; i < times; i++) {
            s += i;
        }
        System.out.println("String 用時: " + (System.nanoTime() - start) / 1e6 + " ms");

        // StringBuilder
        start = System.nanoTime();
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < times; i++) {
            sb.append(i);
        }
        System.out.println("StringBuilder 用時: " + (System.nanoTime() - start) / 1e6 + " ms");

        // StringBuffer
        start = System.nanoTime();
        StringBuffer sbf = new StringBuffer();
        for (int i = 0; i < times; i++) {
            sbf.append(i);
        }
        System.out.println("StringBuffer 用時: " + (System.nanoTime() - start) / 1e6 + " ms");
    }
}

典型運行結(jié)果(JDK 17,普通電腦):

  • String:約 3000~5000 ms(極慢,產(chǎn)生海量臨時對象)
  • StringBuilder:約 10~20 ms
  • StringBuffer:約 15~30 ms(略慢于 Builder,因鎖開銷)

可見,頻繁修改時 StringBuilder 性能遙遙領(lǐng)先。

4. 編譯器優(yōu)化小秘密

  • 單次 + 操作:JVM 會自動優(yōu)化為 StringBuilder:

    String result = "a" + "b" + "c";  // 編譯后相當(dāng)于 new StringBuilder().append("a").append("b").append("c").toString()
    
  • 循環(huán)中 + 操作:不會跨循環(huán)優(yōu)化,仍建議手動用 StringBuilder。

5. 選擇指南(實戰(zhàn)總結(jié))

  1. 內(nèi)容幾乎不修改 → 用 String(最安全、支持常量池)。

  2. 多線程 + 頻繁修改 → 用 StringBuffer(雖慢點但安全)。

  3. 單線程 + 頻繁修改必須用 StringBuilder(性能最佳,99% 場景適用)。

  4. 已知長度大 → 提前指定容量,避免擴容:

    StringBuilder sb = new StringBuilder(10000);  // 預(yù)分配
    
  5. 現(xiàn)代替代方案:復(fù)雜場景可考慮 String.join()、String.format() 或流式操作,但核心拼接仍推薦 StringBuilder。

6. 常見誤區(qū)澄清

  • 誤區(qū):StringBuffer 完全過時了 → 錯!在多線程共享同一緩沖時仍有價值。
  • 誤區(qū):StringBuilder 線程不安全就不能用 → 大多數(shù)業(yè)務(wù)是單線程,安全使用即可。
  • 誤區(qū):String 完全不能用于拼接 → 小量拼接沒問題,大量必須避免。

總結(jié)

到此這篇關(guān)于Java中String、StringBuffer和StringBuilder底層實現(xiàn)的文章就介紹到這了,更多相關(guān)Java中String、StringBuffer和StringBuilder內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java?JDK1.8?安裝和環(huán)境配置教程詳解

    Java?JDK1.8?安裝和環(huán)境配置教程詳解

    文章簡要介紹了JDK 1.8的安裝流程,包括官網(wǎng)下載對應(yīng)系統(tǒng)版本、安裝時選擇非系統(tǒng)盤路徑、配置JAVA_HOME、CLASSPATH和Path環(huán)境變量,最后通過命令行驗證安裝是否成功,感興趣的朋友一起看看吧
    2025-07-07
  • Java使用自定義注解+反射實現(xiàn)字典轉(zhuǎn)換代碼實例

    Java使用自定義注解+反射實現(xiàn)字典轉(zhuǎn)換代碼實例

    這篇文章主要介紹了Java使用自定義注解+反射實現(xiàn)字典轉(zhuǎn)換代碼實例,注解是一種能被添加到j(luò)ava代碼中的元數(shù)據(jù),類、方法、變量、參數(shù)和包都可以用注解來修飾,注解對于它所修飾的代碼并沒有直接的影響,需要的朋友可以參考下
    2023-09-09
  • Mybatis報錯日志BindingException的解決

    Mybatis報錯日志BindingException的解決

    本文主要介紹了Mybatis報錯日志BindingException的解決,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-07-07
  • Java稀疏數(shù)組詳細圖文教程

    Java稀疏數(shù)組詳細圖文教程

    當(dāng)一個數(shù)組中的大部分元素為相同的值,可使用稀疏數(shù)組來保存該數(shù)組,可以將稀疏數(shù)組看做是普通數(shù)組的壓縮,這篇文章主要給大家介紹了關(guān)于Java稀疏數(shù)組的相關(guān)資料,需要的朋友可以參考下
    2023-09-09
  • Nacos客戶端配置中心緩存動態(tài)更新實現(xiàn)源碼

    Nacos客戶端配置中心緩存動態(tài)更新實現(xiàn)源碼

    這篇文章主要為大家介紹了Nacos客戶端配置中心緩存動態(tài)更新實現(xiàn)源碼,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步早日升職加薪
    2022-03-03
  • Java創(chuàng)建線程池的幾種方式代碼示例

    Java創(chuàng)建線程池的幾種方式代碼示例

    這篇文章主要介紹了Java中創(chuàng)建線程池的四種方式,包括使用Executors類、ThreadPoolExecutor類、Future和Callable接口以及Spring的ThreadPoolTaskExecutor,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2025-01-01
  • SpringBoot項目中使用緩存Cache的正確方法分享

    SpringBoot項目中使用緩存Cache的正確方法分享

    緩存可以通過將經(jīng)常訪問的數(shù)據(jù)存儲在內(nèi)存中,減少底層數(shù)據(jù)源如數(shù)據(jù)庫的壓力,從而有效提高系統(tǒng)的性能和穩(wěn)定性。本文就來講講SpringBoot項目中使用緩存Cache的正確姿勢吧
    2023-04-04
  • Java設(shè)計模式之觀察者模式

    Java設(shè)計模式之觀察者模式

    這篇文章主要介紹了Java設(shè)計模式之觀察者模式,觀察者模式,是一種行為性模型,又叫發(fā)布-訂閱模式,他定義對象之間一種一對多的依賴關(guān)系,使得當(dāng)一個對象改變狀態(tài),則所有依賴于它的對象都會得到通知并自動更新,需要的朋友可以參考下
    2023-11-11
  • Java實現(xiàn)時間日期格式轉(zhuǎn)換示例

    Java實現(xiàn)時間日期格式轉(zhuǎn)換示例

    本篇文章主要介紹了ava實現(xiàn)時間日期格式轉(zhuǎn)換示例,實現(xiàn)了各種時間輸出的類型,有興趣的可以了解一下。
    2017-01-01
  • 詳解Java分布式IP限流和防止惡意IP攻擊方案

    詳解Java分布式IP限流和防止惡意IP攻擊方案

    這篇文章主要介紹了詳解Java分布式IP限流和防止惡意IP攻擊方案,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-03-03

最新評論

泰宁县| 彭水| 黑河市| 甘谷县| 申扎县| 永济市| 乌拉特中旗| 台州市| 宿迁市| 灵璧县| 库车县| 房产| 册亨县| 措勤县| 平江县| 伊金霍洛旗| 老河口市| 东乌珠穆沁旗| 麻江县| 甘德县| 白水县| 水城县| 楚雄市| 体育| 台安县| 潞城市| 大同市| 尖扎县| 淳安县| 同仁县| 玛沁县| 郁南县| 潮安县| 泸州市| 信丰县| 朔州市| 东安县| 长乐市| 温宿县| 常州市| 土默特右旗|