好程序員java教程分享+號與append的效率問題

好程序員java教程分享+號與append的效率問題,前言:

對於初學Java的人來講,在學習String的時候,確定有無數我的和咱們講過,」儘可能不要使用+拼接字符串,效率很差,應該使用append 「,但真相真的是這樣的嗎?下面咱們來經過實際代碼來測試一下+號與append的效率問題。

代碼分析

好程序員java教程分享+號與append的效率問題,前言:java

對於初學Java的人來講,在學習String的時候,確定有無數我的和咱們講過,」儘可能不要使用+拼接字符串,效率很差,應該使用append 「,但真相真的是這樣的嗎?下面咱們來經過實際代碼來測試一下+號與append的效率問題。程序員

代碼分析

public class Demo {app

    public static void main(String[] args){性能

        String str = "";學習

        long start = System.currentTimeMillis();測試

        for(int i=0; i<100000; i++)優化

            str += "a";ui

        long end = System.currentTimeMillis();spa

        System.out.println(end - start);3d

 

        StringBuilder sb = new StringBuilder();

        start = System.currentTimeMillis();

        for(int i=0; i<100000; i++)

            sb.append("a");

        str = sb.toString();

        end = System.currentTimeMillis();   

        System.out.println(end - start);

    }

}

咱們分別在循環中分別用+好和append來循環拼接字符串。分別打印出他們的時間:

編譯,運行結果以下:

咱們能夠發現效率確實差距很是的明顯。別急,下面咱們繼續來經過javap命令來查看他的字節碼文件指令:

咱們能夠發現使用+號拼接字符串,在循環體立面每次都會new一個StringBuilder對象,而後調用append方法來追加字符串。

下面咱們看一下使用append拼接的字節碼指令:

綜上咱們能夠發現,在循環體裏面咱們使用+號拼接字符串的時候,編譯器每次都會給咱們建立一個Stringbuilder對象,這也正是再循環體裏面使用+號性能差的根本緣由。難道這就能夠說明咱們永遠都不要使用+號來拼接字符串了嘛?其實這是不徹底正確的。下面咱們再來一組測試:

測試代碼:

public class Test {

    public static void main(String[] args){

        String a = "a";

        String b = "a";

        String c = "a";

        String d = "a";

        String e = a + b + c;

        e += d;

    }

}

 

咱們能夠經過javap命令來查看以上字節碼文件的指令以下:咱們會發現只幫助咱們new了2個StringBuilder對象。咱們能夠獲得以下結論:對於此處的str = str + 「a」,編譯器會處理爲new StringBuilder().append(str).append(「a」),無論一次性+幾個字符串,只要+拼接所有在一條語句中,就只會new一次,循環中+拼接被斷成了十萬條語句,那天然就會new十萬次。

總結

咱們在循環體中不要使用+號來拼接字符串,使用append來代替,可是不在循環體裏面使用+號徹底不會影響性能,甚至編譯器還作了優化。對於此處的str = str + 「a」,編譯器會處理爲new StringBuilder().append(str).append(「a」),無論一次性+幾個字符串,只要+拼接所有在一條語句中,就只會new一次,循環中+拼接被斷成了十萬條語句,那天然就會new十萬次。小夥伴們,大家GET了新技能沒?

咱們分別在循環中分別用+好和append來循環拼接字符串。分別打印出他們的時間:

編譯,運行結果以下:

咱們能夠發現效率確實差距很是的明顯。別急,下面咱們繼續來經過javap命令來查看他的字節碼文件指令:

咱們能夠發現使用+號拼接字符串,在循環體立面每次都會new一個StringBuilder對象,而後調用append方法來追加字符串。

下面咱們看一下使用append拼接的字節碼指令:

綜上咱們能夠發現,在循環體裏面咱們使用+號拼接字符串的時候,編譯器每次都會給咱們建立一個Stringbuilder對象,這也正是再循環體裏面使用+號性能差的根本緣由。難道這就能夠說明咱們永遠都不要使用+號來拼接字符串了嘛?其實這是不徹底正確的。下面咱們再來一組測試:

測試代碼:

public class Test {

    public static void main(String[] args){

        String a = "a";

        String b = "a";

        String c = "a";

        String d = "a";

        String e = a + b + c;

        e += d;

    }

}

 

咱們能夠經過javap命令來查看以上字節碼文件的指令以下:咱們會發現只幫助咱們new了2個StringBuilder對象。咱們能夠獲得以下結論:對於此處的str = str + 「a」,編譯器會處理爲new StringBuilder().append(str).append(「a」),無論一次性+幾個字符串,只要+拼接所有在一條語句中,就只會new一次,循環中+拼接被斷成了十萬條語句,那天然就會new十萬次。

總結

咱們在循環體中不要使用+號來拼接字符串,使用append來代替,可是不在循環體裏面使用+號徹底不會影響性能,甚至編譯器還作了優化。對於此處的str = str + 「a」,編譯器會處理爲new StringBuilder().append(str).append(「a」),無論一次性+幾個字符串,只要+拼接所有在一條語句中,就只會new一次,循環中+拼接被斷成了十萬條語句,那天然就會new十萬次。小夥伴們,大家GET了新技能沒?

相關文章
相關標籤/搜索