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

在大量字符串拼接操作時(shí)請(qǐng)使用StringBuffer解讀

 更新時(shí)間:2025年08月15日 11:15:18   作者:奮力向前123  
StringBuffer為解決String不可變性及線程安全問(wèn)題,提供可變緩沖區(qū),支持高效拼接,其容量動(dòng)態(tài)擴(kuò)展,性能略低于StringBuilder,適用于多線程環(huán)境

StringBuffer的產(chǎn)生背景

StringBuffer是Java早期版本中引入的一個(gè)類(lèi),它的產(chǎn)生背景主要有以下幾個(gè)原因:

1. 解決String不可變性問(wèn)題

  • Java中的String對(duì)象是不可變的(immutable),每次修改String實(shí)際上都是創(chuàng)建新的String對(duì)象
  • 頻繁修改字符串時(shí)會(huì)產(chǎn)生大量臨時(shí)對(duì)象,影響性能
  • StringBuffer提供了可變的字符串緩沖區(qū),可以在原對(duì)象上修改而不創(chuàng)建新對(duì)象

2. 線程安全需求

  • StringBuffer的方法都是同步的(synchronized),適合多線程環(huán)境下的字符串操作
  • 早期Java版本中,多線程編程較為常見(jiàn),需要線程安全的字符串操作類(lèi)

3. 性能優(yōu)化

  • 在大量字符串拼接操作時(shí),使用StringBuffer比直接使用"+"操作符更高效
  • StringBuffer內(nèi)部維護(hù)了一個(gè)可擴(kuò)展的字符數(shù)組,減少了內(nèi)存分配和垃圾回收的開(kāi)銷(xiāo)

4. 歷史原因

  • StringBuffer在Java 1.0中就已經(jīng)存在
  • 后來(lái)(Java 5)又引入了非線程安全的StringBuilder,作為單線程環(huán)境下的替代方案

StringBuffer的設(shè)計(jì)反映了早期Java對(duì)線程安全的重視,但隨著單線程應(yīng)用場(chǎng)景的增加,StringBuilder因其更高的性能而成為更常用的選擇。不過(guò)StringBuffer在多線程環(huán)境下仍然有其價(jià)值。

StringBuffer 詳解

1. StringBuffer 概述

StringBuffer 是 Java 中用于可變字符串操作的類(lèi),位于 java.lang 包中。

它提供了比 String 更高效的字符串修改方式,適用于頻繁修改字符串的場(chǎng)景,并且是線程安全的(方法使用 synchronized 修飾)。

主要特點(diǎn):

  • 可變性:可以直接修改字符串內(nèi)容,而不像 String 每次修改都生成新對(duì)象。
  • 線程安全:方法使用 synchronized 修飾,適合多線程環(huán)境。
  • 高效拼接:內(nèi)部維護(hù)一個(gè)動(dòng)態(tài)擴(kuò)容的字符數(shù)組,減少內(nèi)存分配和垃圾回收開(kāi)銷(xiāo)。

2. StringBuffer 的構(gòu)造方法

構(gòu)造方法說(shuō)明
StringBuffer()構(gòu)造一個(gè)初始容量為 16 的空緩沖區(qū)
StringBuffer(int capacity)構(gòu)造指定初始容量的空緩沖區(qū)
StringBuffer(String str)構(gòu)造一個(gè)初始內(nèi)容為 str 的緩沖區(qū),容量為 str.length() + 16

示例:

StringBuffer sb1 = new StringBuffer();         // 初始容量 16
StringBuffer sb2 = new StringBuffer(32);       // 初始容量 32
StringBuffer sb3 = new StringBuffer("Hello");  // 初始內(nèi)容 "Hello",容量 21 (5 + 16)

3. StringBuffer 的常用方法

(1) 增:append()和insert()

方法說(shuō)明
append(xxx)在末尾追加數(shù)據(jù)(支持多種類(lèi)型:int、char、String 等)
insert(int offset, xxx)在指定位置插入數(shù)據(jù)

示例:

StringBuffer sb = new StringBuffer("Hello");
sb.append(" World");       // "Hello World"
sb.insert(5, ",");         // "Hello, World"

(2) 刪:delete()和deleteCharAt()

方法說(shuō)明
delete(int start, int end)刪除 [start, end) 之間的字符
deleteCharAt(int index)刪除指定位置的字符

示例:

StringBuffer sb = new StringBuffer("Hello, World");
sb.delete(5, 7);          // "Hello World"(刪除 ", ")
sb.deleteCharAt(5);       // "HelloWorld"(刪除空格)

(3) 改:replace()和setCharAt()

方法說(shuō)明
replace(int start, int end, String str)替換 [start, end) 之間的內(nèi)容為 str
setCharAt(int index, char ch)替換指定位置的字符

示例:

StringBuffer sb = new StringBuffer("Hello World");
sb.replace(6, 11, "Java");  // "Hello Java"
sb.setCharAt(0, 'h');       // "hello Java"

(4) 查:charAt()、indexOf()、substring()

方法說(shuō)明
charAt(int index)返回指定位置的字符
indexOf(String str)返回 str 第一次出現(xiàn)的索引
substring(int start, int end)返回 [start, end) 的子字符串

示例:

StringBuffer sb = new StringBuffer("Hello Java");
char ch = sb.charAt(6);          // 'J'
int index = sb.indexOf("Java");  // 6
String sub = sb.substring(6, 10); // "Java"

(5) 其他方法

方法說(shuō)明
length()返回字符串長(zhǎng)度
capacity()返回當(dāng)前緩沖區(qū)容量
reverse()反轉(zhuǎn)字符串
toString()轉(zhuǎn)換為 String

示例:

StringBuffer sb = new StringBuffer("Hello");
System.out.println(sb.length());     // 5
System.out.println(sb.capacity());   // 21 (5 + 16)
sb.reverse();                       // "olleH"
String str = sb.toString();         // 轉(zhuǎn)換為 String

4. StringBuffer 的擴(kuò)容機(jī)制

默認(rèn)初始容量:16(如果未指定)。

擴(kuò)容規(guī)則

  • 當(dāng)字符串長(zhǎng)度超過(guò)當(dāng)前容量時(shí),自動(dòng)擴(kuò)容。
  • 新容量 = (舊容量 * 2) + 2。
  • 如果仍然不夠,則直接擴(kuò)容到所需的最小容量。

示例:

StringBuffer sb = new StringBuffer();  // 初始容量 16
sb.append("1234567890123456");         // 剛好 16 字符,不擴(kuò)容
sb.append("X");                        // 超過(guò)容量,擴(kuò)容至 (16*2)+2 = 34
System.out.println(sb.capacity());     // 34

5. StringBuffer vs StringBuilder

對(duì)比項(xiàng)StringBufferStringBuilder
線程安全? 線程安全(synchronized)? 非線程安全
性能稍慢(同步開(kāi)銷(xiāo))更快
適用場(chǎng)景多線程環(huán)境單線程環(huán)境

推薦使用:

  • 單線程:優(yōu)先用 StringBuilder(更快)。
  • 多線程:用 StringBuffer(線程安全)。

總結(jié)

StringBuffer 適用于頻繁修改字符串,比 String 更高效。

  • 線程安全,但性能略低于 StringBuilder。
  • 擴(kuò)容機(jī)制:默認(rèn) 16,不夠時(shí) (oldCapacity * 2) + 2。
  • 主要方法append()、insert()delete()、replace()、reverse() 等。

適用場(chǎng)景:

  • 多線程環(huán)境下的字符串拼接、修改。
  • 需要頻繁修改字符串內(nèi)容時(shí)(如日志處理、動(dòng)態(tài) SQL 拼接)。

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Spring?Cloud中Sentinel的兩種限流模式介紹

    Spring?Cloud中Sentinel的兩種限流模式介紹

    如何使用Sentinel做流量控制呢?這篇文章就來(lái)為大家詳細(xì)介紹了Spring?Cloud中Sentinel的兩種限流模式,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-05-05
  • java多線程導(dǎo)入excel的方法

    java多線程導(dǎo)入excel的方法

    最近項(xiàng)目寫(xiě)了poi導(dǎo)入excel數(shù)據(jù)到數(shù)據(jù)庫(kù),想把學(xué)到的知識(shí)用于實(shí)踐,于是使用多線程方式導(dǎo)入excel,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-05-05
  • SpringBoot整合JWT實(shí)現(xiàn)登錄認(rèn)證與接口授權(quán)的全流程

    SpringBoot整合JWT實(shí)現(xiàn)登錄認(rèn)證與接口授權(quán)的全流程

    JWT作為一種輕量級(jí)的身份認(rèn)證與授權(quán)方案,憑借其無(wú)狀態(tài)、可跨域、易于擴(kuò)展的特性,成為?Spring?Boot?項(xiàng)目中實(shí)現(xiàn)認(rèn)證授權(quán)的主流選擇,本文將從環(huán)境搭建、核心實(shí)現(xiàn)到進(jìn)階優(yōu)化,完整講解?Spring?Boot?整合?JWT?實(shí)現(xiàn)登錄認(rèn)證與接口授權(quán)的全流程,需要的朋友可以參考下
    2025-12-12
  • Java MyBatis返回兩個(gè)字段作為Map的key和value問(wèn)題

    Java MyBatis返回兩個(gè)字段作為Map的key和value問(wèn)題

    使用MyBatis查詢兩個(gè)字段并返回Map時(shí),需要注意數(shù)據(jù)量和值的類(lèi)型,直接返回Map會(huì)導(dǎo)致報(bào)錯(cuò),使用@MapKey注解可以生成Map,但值是對(duì)象而不是直接值,為了解決這個(gè)問(wèn)題,可以自定義一個(gè)Map結(jié)果處理器MapResultHandler
    2024-12-12
  • springboot之Validation參數(shù)校驗(yàn)詳細(xì)解讀

    springboot之Validation參數(shù)校驗(yàn)詳細(xì)解讀

    這篇文章主要介紹了springboot之Validation參數(shù)校驗(yàn)詳細(xì)解讀,本篇是關(guān)于springboot的參數(shù)校驗(yàn)知識(shí),當(dāng)然也適用其它java應(yīng)用,讀完本篇將學(xué)會(huì)基本的參數(shù)校驗(yàn),自定義參數(shù)校驗(yàn)和分組參數(shù)校驗(yàn),需要的朋友可以參考下
    2023-10-10
  • Java讀取圖片EXIF信息的方法

    Java讀取圖片EXIF信息的方法

    這篇文章主要介紹了Java讀取圖片EXIF信息的方法,較為詳細(xì)的分析了圖片EXIF信息的概念、功能及java讀取EXIF信息的實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2015-07-07
  • 淺談Spring與SpringMVC父子容器的關(guān)系與初始化

    淺談Spring與SpringMVC父子容器的關(guān)系與初始化

    這篇文章主要介紹了淺談Spring與SpringMVC父子容器的關(guān)系與初始化,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-08-08
  • 最新評(píng)論

    前郭尔| 哈尔滨市| 老河口市| 汶川县| 峡江县| 扬州市| 安阳市| 宿松县| 曲麻莱县| 清新县| 乌拉特后旗| 东乡族自治县| 工布江达县| 黎城县| 乳山市| 葫芦岛市| 雷山县| 敦化市| 漯河市| 阿合奇县| 吉首市| 万州区| 额敏县| 弋阳县| 吴川市| 清水县| 兴安县| 哈密市| 霍州市| 尚志市| 府谷县| 无锡市| 余干县| 屯门区| 襄垣县| 远安县| 南安市| 昂仁县| 东城区| 靖西县| 商城县|