String、StringBuffer與StringBuilder之間區(qū)別

(一)三者速度比較

  • String:(遍歷100萬次)

          String aa = "";
          long startTime = System.currentTimeMillis();
          for(int i=0;i<100*100*10;i++){
              //字符串拼接
              aa = aa + "aa";
          }
          long endTime = System.currentTimeMillis();
          System.out.println("耗時(shí):"+String.valueOf(endTime - startTime));
    

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

耗時(shí):7614
  • StringBuffer:(遍歷一億次)

          StringBuffer aa = new StringBuffer();
          String ss = "ss";
          long startTime = System.currentTimeMillis();
          for(int i=0;i<100*100*100*100;i++){
              //字符串拼接
              aa.append(ss);
          }
          long endTime = System.currentTimeMillis();
          System.out.println("耗時(shí):"+String.valueOf(endTime - startTime));
    

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

耗時(shí):3128
  • StringBuilder:(遍歷一億次)

          StringBuilder aa = new StringBuilder();
          String ss = "ss";
          long startTime = System.currentTimeMillis();
          for(int i=0;i<100*100*100*100;i++){
              //字符串拼接
              aa.append(ss);
          }
          long endTime = System.currentTimeMillis();
          System.out.println("耗時(shí):"+String.valueOf(endTime - startTime));
    

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

耗時(shí):1240

結(jié)論:

(1)速度比較:String < StringBuffer < StringBuilder
(2)String的處理速度比StringBuffer、StringBuilder要慢的多。

(二)String的處理速度為什么要比StringBuffer、StringBuilder慢的多?

  • String是不可變的對(duì)象
  • StringBuffer是可變對(duì)象
  • StringBuilder是可變對(duì)象

請(qǐng)結(jié)合上面的代碼理解這個(gè)問題:
(1)String本身就是一個(gè)對(duì)象,因?yàn)镾tring不可變對(duì)象,所以,每次遍歷對(duì)字符串做拼接操作,都會(huì)重新創(chuàng)建一個(gè)對(duì)象,循環(huán)100萬次就是創(chuàng)建100萬個(gè)對(duì)象,非常的消耗內(nèi)存空間,而且創(chuàng)建對(duì)象本身就是一個(gè)耗時(shí)操作,創(chuàng)建100萬次對(duì)象就相當(dāng)?shù)暮臅r(shí)了。
(2)StringBuffer和StringBuilder只需要?jiǎng)?chuàng)建一個(gè)StringBuffer或StringBuilder對(duì)象,然后用append拼接字符串,就算拼接一億次,仍然只有一個(gè)對(duì)象。

(三)是不是可以拋棄使用String,轉(zhuǎn)而使用StringBuffer和StringBuilder呢?

答案是否定的。
上文的總結(jié)只是針對(duì)于數(shù)據(jù)量比較多的情況,但是數(shù)據(jù)量比較少的情況呢?
我們分析一下代碼:
(1)String遍歷代碼:一開始定義一個(gè)String常量(創(chuàng)建一個(gè)String對(duì)象), 再開始遍歷;
(2)StringBuffer代碼:一開始定義一個(gè)String常量(創(chuàng)建一個(gè)String對(duì)象)和一個(gè)創(chuàng)建StringBuffer對(duì)象,再開始遍歷;
(3)StringBuiler代碼:一開始定義一個(gè)String常量(創(chuàng)建一個(gè)String對(duì)象)和一個(gè)創(chuàng)建StringBuiler對(duì)象,再開始遍歷;

(2)和(3)比(1)多了一個(gè)創(chuàng)建對(duì)象流程,所以,如果數(shù)據(jù)量比較小的情況建議使用String。

(四)是StringBuffer和StringBuilder的區(qū)別?

  • StringBuffer是線程安全的
  • StringBuilder是非線程安全的, 這也是速度比StringBuffer快的原因

注:不知道線程安全的可以自行查找資料補(bǔ)腦

(五)使用場景

(1)如果要操作少量的數(shù)據(jù)用 String
(2)單線程操作字符串緩沖區(qū) 下操作大量數(shù)據(jù) StringBuilder
(3)多線程操作字符串緩沖區(qū) 下操作大量數(shù)據(jù) StringBuffer

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容