Bre*_*rom 0 java stringbuilder
我在工作中的一些代码中找到了一个部分,其中使用这种格式创建了一堆长字符串:
String s = "" +
"...\n" +
"...\n" +
Run Code Online (Sandbox Code Playgroud)
出于好奇,决定快速测试一下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));
}
}
Run Code Online (Sandbox Code Playgroud)
输出:
Testing concat version
Time to concat strings: 5
Now testing with stringbuilder
Time to build strings with stringbuilder: 2455
Run Code Online (Sandbox Code Playgroud)
我以为StringBuilders应该会更快一些,但在这种情况下它会慢一些。这是怎么回事?
第一部分不进行任何串联。串联发生在编译时。它所做的只是在数组的所有索引中存储相同的唯一长字符串。
串联时应使用StringBuilder。即使在运行时使用以下命令连接动态内容时
"a" + someVar + "b" + someOtherVar;
Run Code Online (Sandbox Code Playgroud)
编译器生成的代码使用StringBuilder进行串联(或使用代码的速度至少与StringBuilder的速度相同,具体取决于Java版本)。
慢的是:
String s = "";
for (String e : array) {
s += e;
}
Run Code Online (Sandbox Code Playgroud)
这会创建大量(很好,每个数组元素一个)临时字符串,并将大量这些临时字符串复制到下一个副本中。
| 归档时间: |
|
| 查看次数: |
52 次 |
| 最近记录: |