java - 为什么用 stringbuilder 连接字符串需要更长的时间?
问题描述
我在工作中的一些代码中发现了一个部分,其中使用这种格式创建了一堆长字符串:
String s = "" +
"...\n" +
"...\n" +
只是出于好奇,决定做一个快速测试,看看 StringBuilder 是否会产生任何明显的差异。
public class TestStringConcat {
public static void main(String[] args) {
int arraySize = 1000000;
String[] strings1 = new String[arraySize];
String[] strings2 = new String[arraySize];
System.out.println("Testing concat version");
long startTime = System.currentTimeMillis();
for (int i = 0; i < arraySize; i++) {
strings1[i] = "" +
"A big long multiline string"; //35 lines of string omitted
}
long endTime = System.currentTimeMillis();
System.out.println("Time to concat strings: " + (endTime - startTime));
System.out.println("Now testing with stringbuilder ");
startTime = System.currentTimeMillis();
for (int i = 0; i < arraySize; i++) {
StringBuilder sb = new StringBuilder();
sb.append("A big long multiline string"); //35 lines of string omitted
strings2[i] = sb.toString();
}
endTime = System.currentTimeMillis();
System.out.println("Time to build strings with stringbuilder: " + (endTime - startTime));
}
}
输出:
Testing concat version
Time to concat strings: 5
Now testing with stringbuilder
Time to build strings with stringbuilder: 2455
我认为 StringBuilders 应该更快,但在这种情况下它更慢。这是怎么回事?
解决方案
第一部分不做任何连接。连接发生在编译时。它所做的只是在数组的所有索引中存储相同的、唯一的长字符串。
在循环中连接时应使用 StringBuilder。即使您在运行时使用连接动态内容
"a" + someVar + "b" + someOtherVar;
编译器生成使用 StringBuilder 连接的代码(或使用代码至少与 StringBuilder 一样快,具体取决于 Java 版本)。
慢的是:
String s = "";
for (String e : array) {
s += e;
}
这会创建很多(嗯,每个数组元素一个)临时字符串,并将这些临时字符串的大量副本复制到下一个字符串中。
推荐阅读
- json - 无论如何都可以将 dwg 文件转换为 three.js 可接受的格式吗?
- amazon-ecs - 如何在 AWS ECS 中扩展和缩减集群实例
- javascript - Bootstrap-vue 模式与全屏-vue
- python-3.x - 需要创建样本数据集
- java - getClass().getName() 不返回片段中的类名
- c# - selenium 多线程 chrome 中的数据输入
- intellij-idea - Intellij 的“课堂上找不到主课”
- python - Tensorflow 模型,“元组”对象没有属性“层”
- python - Python-IndexError:列表索引超出范围,而在for循环中
- powershell - Powershell send-mailmessage 从 csv 读取 17k 电子邮件并在每封电子邮件中发送给 100 个用户