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

深入解析Java編程中的StringBuffer與StringBuider

 更新時(shí)間:2015年09月25日 17:59:58   投稿:goldensun  
這篇文章主要介紹了Java編程中的StringBuffer與StringBuider,是Java入門學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下

String 的值是不可變的,每次對(duì)String的操作都會(huì)生成新的String對(duì)象,不僅效率低,而且耗費(fèi)大量?jī)?nèi)存空間。

StringBuffer類和String類一樣,也用來表示字符串,但是StringBuffer的內(nèi)部實(shí)現(xiàn)方式和String不同,在進(jìn)行字符串處理時(shí),不生成新的對(duì)象,在內(nèi)存使用上要優(yōu)于String。

StringBuffer 默認(rèn)分配16字節(jié)長(zhǎng)度的緩沖區(qū),當(dāng)字符串超過該大小時(shí),會(huì)自動(dòng)增加緩沖區(qū)長(zhǎng)度,而不是生成新的對(duì)象。

StringBuffer不像String,只能通過 new 來創(chuàng)建對(duì)象,不支持簡(jiǎn)寫方式,例如:

StringBuffer str1 = new StringBuffer(); // 分配16個(gè)字節(jié)長(zhǎng)度的緩沖區(qū)
StringBuffer str2 = =new StringBuffer(512); // 分配512個(gè)字節(jié)長(zhǎng)度的緩沖區(qū)
// 在緩沖區(qū)中存放了字符串,并在后面預(yù)留了16個(gè)字節(jié)長(zhǎng)度的空緩沖區(qū)
StringBuffer str3 = new StringBuffer(www.weixueyuan.net);


StringBuffer類的主要方法

StringBuffer類中的方法主要偏重于對(duì)于字符串的操作,例如追加、插入和刪除等,這個(gè)也是StringBuffer類和String類的主要區(qū)別。實(shí)際開發(fā)中,如果需要對(duì)一個(gè)字符串進(jìn)行頻繁的修改,建議使用 StringBuffer。
1) append() 方法

append() 方法用于向當(dāng)前字符串的末尾追加內(nèi)容,類似于字符串的連接。調(diào)用該方法以后,StringBuffer對(duì)象的內(nèi)容也發(fā)生改變,例如:

StringBuffer str = new StringBuffer(“biancheng100”);
str.append(true);


則對(duì)象str的值將變成”biancheng100true”。注意是str指向的內(nèi)容變了,不是str的指向變了。

字符串的”+“操作實(shí)際上也是先創(chuàng)建一個(gè)StringBuffer對(duì)象,然后調(diào)用append()方法將字符串片段拼接起來,最后調(diào)用toString()方法轉(zhuǎn)換為字符串。

這樣看來,String的連接操作就比StringBuffer多出了一些附加操作,效率上必然會(huì)打折扣。

但是,對(duì)于長(zhǎng)度較小的字符串,”+“操作更加直觀,更具可讀性,有些時(shí)候可以稍微犧牲一下效率。
2)  deleteCharAt()

deleteCharAt() 方法用來刪除指定位置的字符,并將剩余的字符形成新的字符串。例如:

StringBuffer str = new StringBuffer("abcdef");
str. deleteCharAt(3);


該代碼將會(huì)刪除索引值為3的字符,即”d“字符。

你也可以通過delete()方法一次性刪除多個(gè)字符,例如:

StringBuffer str = new StringBuffer("abcdef");
str.delete(1, 4);


該代碼會(huì)刪除索引值為1~4之間的字符,包括索引值1,但不包括4。
3) insert() 方法

insert() 用來在指定位置插入字符串,可以認(rèn)為是append()的升級(jí)版。例如:

StringBuffer str = new StringBuffer("abcdef");
str.insert(3, "xyz");


最后str所指向的字符串為 abcdxyzef。
4) setCharAt() 方法

setCharAt() 方法用來修改指定位置的字符。例如:

StringBuffer str = new StringBuffer("abcdef");
str.setCharAt(3, 'z');


該代碼將把索引值為3的字符修改為 z,最后str所指向的字符串為 abczef。

以上僅僅是部分常用方法的簡(jiǎn)單說明,更多方法和解釋請(qǐng)查閱API文檔。
String和StringBuffer的效率對(duì)比

為了更加明顯地看出它們的執(zhí)行效率,下面的代碼,將26個(gè)英文字母加了10000次。

public class Demo {
  public static void main(String[] args){
    String fragment = "abcdefghijklmnopqrstuvwxyz";
    int times = 10000;
    
    // 通過String對(duì)象
    long timeStart1 = System.currentTimeMillis();
    String str1 = "";
    for (int i=0; i<times; i++) {
      str1 += fragment;
    }
    long timeEnd1 = System.currentTimeMillis();
    System.out.println("String: " + (timeEnd1 - timeStart1) + "ms");
    
    // 通過StringBuffer
    long timeStart2 = System.currentTimeMillis();
    StringBuffer str2 = new StringBuffer();
    for (int i=0; i<times; i++) {
      str2.append(fragment);
    }
    long timeEnd2 = System.currentTimeMillis();
    System.out.println("StringBuffer: " + (timeEnd2 - timeStart2) + "ms");
  }
}

運(yùn)行結(jié)果:

String: 5287ms
StringBuffer: 3ms

結(jié)論很明顯,StringBuffer的執(zhí)行效率比String快上千倍,這個(gè)差異隨著疊加次數(shù)的增加越來越明顯,當(dāng)疊加次數(shù)達(dá)到30000次的時(shí)候,運(yùn)行結(jié)果為:

String: 35923ms
StringBuffer: 8ms

所以,強(qiáng)烈建議在涉及大量字符串操作時(shí)使用StringBuffer。
StringBuilder類

StringBuilder類和StringBuffer類功能基本相似,方法也差不多,主要區(qū)別在于StringBuffer類的方法是多線程安全的,而StringBuilder不是線程安全的,相比而言,StringBuilder類會(huì)略微快一點(diǎn)。

StringBuffer、StringBuilder、String中都實(shí)現(xiàn)了CharSequence接口。

CharSequence是一個(gè)定義字符串操作的接口,它只包括length()、charAt(int index)、subSequence(int start, int end) 這幾個(gè)API。

StringBuffer、StringBuilder、String對(duì)CharSequence接口的實(shí)現(xiàn)過程不一樣,如下圖所示:

可見,String直接實(shí)現(xiàn)了CharSequence接口;StringBuilder 和 StringBuffer都是可變的字符序列,它們都繼承于AbstractStringBuilder,實(shí)現(xiàn)了CharSequence接口。
總結(jié)

線程安全:

StringBuffer:線程安全
StringBuilder:線程不安全

速度:
一般情況下,速度從快到慢為 StringBuilder > StringBuffer > String,當(dāng)然這是相對(duì)的,不是絕對(duì)的。

使用環(huán)境:
操作少量的數(shù)據(jù)使用 String;
單線程操作大量數(shù)據(jù)使用 StringBuilder;
多線程操作大量數(shù)據(jù)使用 StringBuffer。

相關(guān)文章

  • Java中YYYY-MM-dd與yyyy-MM-dd的區(qū)別及跨年問題

    Java中YYYY-MM-dd與yyyy-MM-dd的區(qū)別及跨年問題

    YYYY-MM-dd可能會(huì)導(dǎo)致跨年周的日期被歸屬到錯(cuò)誤的年份, yyyy-MM-dd總是表示實(shí)際的日歷年份,無論日期所在的周是否跨年,本文就來介紹一下兩者的區(qū)別,感興趣的可以了解一下
    2024-01-01
  • Ribbon單獨(dú)使用,配置自動(dòng)重試,實(shí)現(xiàn)負(fù)載均衡和高可用方式

    Ribbon單獨(dú)使用,配置自動(dòng)重試,實(shí)現(xiàn)負(fù)載均衡和高可用方式

    這篇文章主要介紹了Ribbon單獨(dú)使用,配置自動(dòng)重試,實(shí)現(xiàn)負(fù)載均衡和高可用方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-12-12
  • 如何解決Nacos服務(wù)下線報(bào)錯(cuò)問題

    如何解決Nacos服務(wù)下線報(bào)錯(cuò)問題

    這篇文章主要介紹了如何解決Nacos服務(wù)下線報(bào)錯(cuò)問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-07-07
  • 如何實(shí)現(xiàn)java遞歸 處理權(quán)限管理菜單樹或分類

    如何實(shí)現(xiàn)java遞歸 處理權(quán)限管理菜單樹或分類

    這篇文章主要介紹了如何實(shí)現(xiàn)java遞歸 處理權(quán)限管理菜單樹或分類,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-01-01
  • java 引用類型的數(shù)據(jù)傳遞的是內(nèi)存地址實(shí)例

    java 引用類型的數(shù)據(jù)傳遞的是內(nèi)存地址實(shí)例

    這篇文章主要介紹了java 引用類型的數(shù)據(jù)傳遞的是內(nèi)存地址實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-10-10
  • mybatis-plus中更新null值的問題解決

    mybatis-plus中更新null值的問題解決

    本文主要介紹 mybatis-plus 中常使用的 update 相關(guān)方法的區(qū)別,以及更新 null 的方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-04-04
  • SpringBoot修改內(nèi)置tomcat版本的操作步驟

    SpringBoot修改內(nèi)置tomcat版本的操作步驟

    生產(chǎn)環(huán)境使用的外部部署Tomcat還是內(nèi)置Tomcat由于版本安全漏洞,往往需要升級(jí)到指定的安全版本,本文演示一下SpringBoot升級(jí)內(nèi)置的Tomcat版本,感興趣的小伙伴跟著小編一起來看看吧
    2024-07-07
  • Spring中AOP注解@Aspect的使用詳解

    Spring中AOP注解@Aspect的使用詳解

    這篇文章主要介紹了Spring中AOP注解@Aspect的使用詳解,AOP是種面向切面的編程思想,面向切面編程是將程序抽象成各個(gè)切面,將那些影響了多個(gè)類的公共行為抽取到一個(gè)可重用模塊里,減少系統(tǒng)的重復(fù)代碼,降低模塊間的耦合度,增強(qiáng)代碼的可操作性和可維護(hù)性,需要的朋友可以參考下
    2024-01-01
  • JAVA編程不能不知道的反射用法總結(jié)

    JAVA編程不能不知道的反射用法總結(jié)

    這篇文章主要介紹了Java反射技術(shù)原理與用法,結(jié)合實(shí)例形式分析了Java反射技術(shù)的基本概念、功能、原理、用法及操作注意事項(xiàng),需要的朋友可以參考下
    2021-07-07
  • JavaWeb實(shí)現(xiàn)自動(dòng)登錄功能

    JavaWeb實(shí)現(xiàn)自動(dòng)登錄功能

    這篇文章主要為大家詳細(xì)介紹了JavaWeb實(shí)現(xiàn)自動(dòng)登錄功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-08-08

最新評(píng)論

蒲江县| 安远县| 剑川县| 东光县| 广安市| 铜川市| 阿拉善左旗| 博兴县| 苍山县| 噶尔县| 阿图什市| 湘乡市| 咸宁市| 冷水江市| 馆陶县| 阿勒泰市| 堆龙德庆县| 阿图什市| 固阳县| 延庆县| 财经| 梨树县| 连江县| 舒城县| 铜陵市| 阜新市| 武川县| 崇左市| 安徽省| 肇源县| 孟村| 阿拉尔市| 平塘县| 双柏县| 河池市| 山西省| 兴业县| 河东区| 宁国市| 游戏| 福安市|