更新:我通過連接+
運算符進行測試,性能幾乎與使用StringBuilder進行測試(結果結果)相同。這表明,正如你們中的一些人在答案中提到的那樣,表現較慢的原因是格式分析。Java的printf()方法是否有效連接和打印字符串?
結論:Java的printf()不是連接和打印字符串的有效方法。應該使用+
運營商或者最好是StringBuilder
以獲得更好的性能。
在創建字符串時,Java的printf()
是否使用慢串聯?即它是否在將每個元素附加到最終的String之後創建一個新的String?
我測試了使用StringBuilder
來創建字符串我得到的性能提高了大約4倍的運行時間。這部分程序在我的程序中被稱爲數千次。
兩個測試之間的唯一差異是下面的代碼塊:
1)printf()
(0.8秒):
System.out.printf("%d %d %d %d %d %d\n", nums[a], nums[b],
nums[c], nums[d], nums[e], nums[f]);
2)StringBuilder
+ println()
(0.2秒):
StringBuilder sb = new StringBuilder();
sb.append(nums[a]);
sb.append(' ');
sb.append(nums[b]);
sb.append(' ');
sb.append(nums[c]);
sb.append(' ');
sb.append(nums[d]);
sb.append(' ');
sb.append(nums[e]);
sb.append(' ');
sb.append(nums[f]);
System.out.println(sb.toString());
3)+
operaror + println()
(0.22秒):
System.out.println(nums[a] + " " + nums[b] + " " + nums[c] + " " + nums[d] + " "
+ nums[e] + " " + nums[f]);
我的猜測是連接是無關的,但格式的分析是需要時間的。 – chrylis
您可以自己連接字符串以查看是否有任何區別。如果不是@ chrylis最有可能是正確的,否則,你可能正確,但是我不會創建一個新的字符串圖像會導致大量的性能消耗。這種差異很可能發生在printf()中的格式分析中。 – CalebB
好吧,如果你看看源代碼,它會做更多的事情。 ([鏈接](http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/8-b132/java/util/Formatter.java#Formatter.format%28java.util.Locale %2Cjava.lang.String%2Cjava.lang.Object%5B%5D%29)) – Bubletan