日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

Java StringBuffer与StringBuider

發(fā)布時間:2025/3/15 java 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java StringBuffer与StringBuider 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

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

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

StringBuffer 默認分配16字節(jié)長度的緩沖區(qū),當字符串超過該大小時,會自動增加緩沖區(qū)長度,而不是生成新的對象。

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

  • StringBuffer?str1?=?new?StringBuffer();?// 分配16個字節(jié)長度的緩沖區(qū)
  • StringBuffer?str2?=?=new?StringBuffer(512);?// 分配512個字節(jié)長度的緩沖區(qū)
  • // 在緩沖區(qū)中存放了字符串,并在后面預留了16個字節(jié)長度的空緩沖區(qū)
  • StringBuffer?str3?=?new?StringBuffer(“www.ryxxff.com”);
  • StringBuffer類的主要方法

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

    1) append() 方法

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

  • StringBuffer?str?=?new?StringBuffer(“biancheng100”);
  • str.append(true);
  • 則對象str的值將變成”biancheng100true”。注意是str指向的內(nèi)容變了,不是str的指向變了。

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

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

    但是,對于長度較小的字符串,”+“操作更加直觀,更具可讀性,有些時候可以稍微犧牲一下效率。

    2) ?deleteCharAt()

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

  • StringBuffer?str?=?new?StringBuffer(“abcdef”);
  • str.?deleteCharAt(3);
  • 該代碼將會刪除索引值為3的字符,即”d“字符。

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

  • StringBuffer?str?=?new?StringBuffer(“abcdef”);
  • str.delete(1,?4);
  • 該代碼會刪除索引值為1~4之間的字符,包括索引值1,但不包括4。

    3) insert() 方法

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

  • 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。

    以上僅僅是部分常用方法的簡單說明,更多方法和解釋請查閱API文檔。

    String和StringBuffer的效率對比

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

  • public?class?Demo?{
  • public?static?void?main(String[]?args){
  • String?fragment?=?“abcdefghijklmnopqrstuvwxyz”;
  • int?times?=?10000;
  • ?
  • // 通過String對象
  • 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”);
  • }
  • }
  • 運行結果:
    String: 5287ms
    StringBuffer: 3ms

    結論很明顯,StringBuffer的執(zhí)行效率比String快上千倍,這個差異隨著疊加次數(shù)的增加越來越明顯,當疊加次數(shù)達到30000次的時候,運行結果為:
    String: 35923ms
    StringBuffer: 8ms

    所以,強烈建議在涉及大量字符串操作時使用StringBuffer。

    StringBuilder類

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

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

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

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


    圖1 ?對CharSequence接口的實現(xiàn)

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

    總結

    線程安全:

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

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

    使用環(huán)境:

    • 操作少量的數(shù)據(jù)使用 String;
    • 單線程操作大量數(shù)據(jù)使用 StringBuilder;
    • 多線程操作大量數(shù)據(jù)使用 StringBuffer。
    • 四. Java繼承和多態(tài)
      1.?繼承的概念與實現(xiàn)
      2.?Java super關鍵字
      3.?繼承中的方法的覆蓋和重載
      4.?多態(tài)和動態(tài)綁定
      5.?instanceof 運算符
      6.?多態(tài)對象的類型轉換
      7.?Java static關鍵字
      8.?Java final關鍵字

      9.?Java Object類

    總結

    以上是生活随笔為你收集整理的Java StringBuffer与StringBuider的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。