我遇到了以下代码:
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 100000; i++) {
String line = "foo" + Integer.toString(i) + "bar\n";
sb.append(line);
}
System.out.print(sb.toString());
我的问题是使用以下代码会带来什么性能/内存差异:
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 100000; i++) {
sb.append("foo").append(Integer.toString(i)).append("bar\n");
}
System.out.print(sb.toString());
或
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 100000; i++) {
sb.append(String.format("foo %i bar", i\n));
}
System.out.print(sb.toString());
我看到很多问题/答案表明使用:StringcumulativeOutput = ""; ...cumulativeOutput += "foo"+ Integer.toString(i) + "bar\n";
是浪费(本质上是在每次循环迭代上创建一个新的 StringBuilder),但没有看到任何有关的直接答案上述情况。我还发现字符串的长度很重要,并且有兴趣了解以下代码如何进行比较:
StringBuilder sb = new StringBuilder();
String foo = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. ";
String bar = " Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.\n";
for (int i = 1000000000; i < 1000100000; i++) {
String line = foo + Integer.toString(i) + bar;
sb.append(line);
}
System.out.print(sb.toString());
我预计第二个循环将是最快的(链接.append),但我对是否有一些隐藏的细节感兴趣。期待看到其他人发现或知道什么!
最佳答案
你的第一个例子:
String line = "foo" + Integer.toString(i) + "bar\n";
sb.append(line);
相当于:
String line = new StringBuilder("foo").append(Integer.toString(i)).append("bar\n").toString();
sb.append(line);
你的第三个例子:
sb.append(String.format("foo %i bar", i\n));
是最浪费的,因为它相当于:
StringBuilder builder = new StringBuilder();
Formatter formatter = new Formatter(builder);
formatter.format("foo %i bar", i);
String value = formatter.out().toString();
sb.append(value);
您的第二个示例具有最佳性能,但 Integer.toString 的使用是多余的,并且会创建不必要的字符串:
sb.append("foo").append(i).append("bar\n");
在此形式中,不会创建新对象(除非 StringBuilder 必须扩展其内部缓冲区)。
差异非常小,通常小得难以察觉。可以运行 Microsoft Office 或 Doom Eternal 的现代系统可能不会明显减慢创建字符串的速度。即时编译器完全有可能在运行时将 append(Integer.valueOf(i))
转换为 append(i)
。
如果您需要有关最佳实践的指导,答案是:根本不要在循环中使用 +
或 String.format
。
关于Java StringBuilder 参数性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70994407/