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

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

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

前言

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

1. 全面對(duì)比表

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

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

  • String 的不可變性

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

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

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

    abstract class AbstractStringBuilder {
        char[] value;      // 非 final,可擴(kuò)容
        int count;         // 當(dāng)前長(zhǎng)度
    }
    
    • append 等操作直接操作 value 數(shù)組。
    • 擴(kuò)容時(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) { ... }  // 無(wú) synchronized
    

3. 性能對(duì)比實(shí)測(cè)(循環(huán) 10 萬(wàn)次拼接)

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 用時(shí): " + (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 用時(shí): " + (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 用時(shí): " + (System.nanoTime() - start) / 1e6 + " ms");
    }
}

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

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

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

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

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

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

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

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

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

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

  4. 已知長(zhǎng)度大 → 提前指定容量,避免擴(kuò)容:

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

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

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

總結(jié)

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

相關(guān)文章

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

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

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

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

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

    Mybatis報(bào)錯(cuò)日志BindingException的解決

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

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

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

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

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

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

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

    SpringBoot項(xiàng)目中使用緩存Cache的正確方法分享

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

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

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

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

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

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

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

最新評(píng)論

文登市| 鹿泉市| 石城县| 大理市| 勐海县| 河间市| 金平| 中西区| 盈江县| 阜新| 石狮市| 抚远县| 卓尼县| 岳阳县| 吉木乃县| 宁夏| 山东省| 陈巴尔虎旗| 临洮县| 龙井市| 桃园市| 卢湾区| 云和县| 天柱县| 台北市| 抚松县| 天峨县| 和龙市| 济宁市| 紫阳县| 博罗县| 兰坪| 南阳市| 微山县| 南江县| 时尚| 休宁县| 商河县| 通州市| 柳河县| 桐庐县|