为什么用stringbuilder连接字符串需要更长的时间?

问题描述 投票:0回答:1

我在一些代码中找到了一个部分,其中使用这种格式创建了一堆长字符串:

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应该更快,但在这种情况下,它会慢一些。这是怎么回事?

java stringbuilder
1个回答
7
投票

第一部分没有做任何连接。连接发生在编译时。它所做的只是在数组的所有索引中存储相同的,唯一的长字符串。

在循环中连接时应使用StringBuilder。即使你在运行时使用连接动态内容

"a" + someVar + "b" + someOtherVar;

编译器生成使用StringBuilder进行连接的代码(或者至少使用与StringBuilder一样快的代码,具体取决于Java版本)。

什么是缓慢的:

String s = "";
for (String e : array) {
    s += e;
}

这会在临时字符串中创建很多(嗯,每个数组元素一个),并将这些临时字符串的大量副本创建到下一个字符串中。

© www.soinside.com 2019 - 2024. All rights reserved.