我们必须一直为日志输出等构建字符串。在 JDK 版本中,我们了解了何时使用StringBuffer(许多附加,线程安全)和StringBuilder(许多附加,非线程安全)。
StringBuffer
StringBuilder
使用上有什么建议String.format()?它是有效的,还是我们被迫坚持对性能很重要的单行代码进行串联?
String.format()
例如丑陋的旧风格,
String s = "What do you get if you multiply " + varSix + " by " + varNine + "?";
与整洁的新样式(String.format,可能更慢)相比,
String s = String.format("What do you get if you multiply %d by %d?", varSix, varNine);
注意:我的具体用例是贯穿我的代码的数百个“单行”日志字符串。它们不涉及循环,所以StringBuilder太重了。我String.format()特别感兴趣。
我写了一个小类来测试两者的性能更好,并且 + 领先于格式。乘以 5 到 6 倍。自己尝试一下
import java.io.*; import java.util.Date; public class StringTest{ public static void main( String[] args ){ int i = 0; long prev_time = System.currentTimeMillis(); long time; for( i = 0; i< 100000; i++){ String s = "Blah" + i + "Blah"; } time = System.currentTimeMillis() - prev_time; System.out.println("Time after for loop " + time); prev_time = System.currentTimeMillis(); for( i = 0; i<100000; i++){ String s = String.format("Blah %d Blah", i); } time = System.currentTimeMillis() - prev_time; System.out.println("Time after for loop " + time); } }
对不同的 N 运行上述代码表明两者的行为都是线性的,但String.format速度要慢 5-30 倍。
String.format
原因是在当前的实现中,String.format首先用正则表达式解析输入,然后再填充参数。另一方面,与 plus 的连接由 javac(而不是 JIT)优化并StringBuilder.append直接使用。
StringBuilder.append