循環(huán)中拼接String不同方法性能耗時(shí)對(duì)比

對(duì)比背景

  • Java中最常用的拼接字符串方法就是 + 或 +=,使用上簡單方便。但如果拼接數(shù)量比較大,例如在循環(huán)中拼接字符串,可能會(huì)有性能問題;

測(cè)試數(shù)據(jù)

  • 循環(huán)100000次進(jìn)行String拼接,對(duì)比+=和使用StringBuilder,StringBuffer。運(yùn)行在JDK8,查看循環(huán)耗時(shí)時(shí)間

具體實(shí)現(xiàn)如下

  • 使用+=進(jìn)行拼接String
@Test
    //使用+=進(jìn)行拼接String
    public void testCase1(){
        String str = "";
        long startTime= System.currentTimeMillis();
        for (int i = 0;i< 100000;i++){
            str += i;
        }
        long endTime= System.currentTimeMillis();
        System.out.println(endTime-startTime);

    }
  • 使用StringBuilder
     //使用StringBuilder
    @Test
    public void testCase2(){
        StringBuilder stringBuilder = new StringBuilder();
        long startTime= System.currentTimeMillis();
        for (int i = 0 ; i< 100000;i++){
            stringBuilder.append(i);
        }
        long endTime= System.currentTimeMillis();
        System.out.println(endTime-startTime);
    }
  • 使用StringBuffer
//使用StringBuffer
    @Test
    public void testCase3(){
        StringBuffer str = new StringBuffer();
        long startTime= System.currentTimeMillis();
        for (int i = 0; i < 100000; i++) {
            str.append(i);
        }
        long endTime= System.currentTimeMillis();
        System.out.println(endTime-startTime);
    }
  • 執(zhí)行結(jié)果對(duì)比


  • 使用+=進(jìn)行拼接String耗時(shí)(單位:毫秒):18301
  • 使用StringBuilder耗時(shí)(單位:毫秒):5
  • 使用StringBuffer耗時(shí)(單位:毫秒):6

原理分析

  • 可以看到在上面的10w次循環(huán)拼接中,直接使用+=拼接的時(shí)間對(duì)比其他兩個(gè)有近3600倍的差距,因?yàn)槊看窝h(huán)java都會(huì)自動(dòng)創(chuàng)建一個(gè)StringBuilder用來做String拼接,然后轉(zhuǎn)化為String賦值給str,造成了大量的對(duì)象創(chuàng)建開銷,反編譯代碼如下


  • 而使用StringBuilder和StringBuffer的情況性能上就好太多了,如果對(duì)總的字符串長度有一個(gè)基本的預(yù)期,可以在new的時(shí)候指定capacity以節(jié)省當(dāng)空間不夠時(shí)擴(kuò)容的開銷。

  • StringBuffer作為線程安全類,在以前性能是比較差的,因此才有了非線程安全的StringBuilder,但JDK1.6以后由于java對(duì)synchronized鎖做了優(yōu)化(偏向鎖→ 輕量級(jí)鎖→ 重量級(jí)鎖),StringBuffer性能有了極大提升,但習(xí)慣性的在沒有并發(fā)情況下,還是使用StringBuilder

解決方案

當(dāng)有大量字符串拼接需要時(shí),尤其是在循環(huán)中,考慮使用StringBuilder或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ù)。

相關(guān)閱讀更多精彩內(nèi)容

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