好程序員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了新技能沒?