串联运算符 (+) 与 concat()

2022-09-01 13:57:29

对于字符串串联,我们可以使用 或 concat 运算符 。concat()(+)

我尝试了以下性能测试,发现字符串串联的速度更快,内存效率高。concat()

100,000 次的字符串串联比较

String str = null;

//------------Using Concatenation operator-------------
long time1 = System.currentTimeMillis();
long freeMemory1 = Runtime.getRuntime().freeMemory();

for(int i=0; i<100000; i++){
    str = "Hi";
    str = str+" Bye";
}
long time2 = System.currentTimeMillis();
long freeMemory2 = Runtime.getRuntime().freeMemory();

long timetaken1 = time2-time1;
long memoryTaken1 = freeMemory1 - freeMemory2;
System.out.println("Concat operator  :" + "Time taken =" + timetaken1 +
                   " Memory Consumed =" + memoryTaken1);

//------------Using Concat method-------------
long time3 = System.currentTimeMillis();
long freeMemory3 = Runtime.getRuntime().freeMemory();
for(int j=0; j<100000; j++){
    str = "Hi";
    str = str.concat(" Bye");
}
long time4 = System.currentTimeMillis();
long freeMemory4 = Runtime.getRuntime().freeMemory();
long timetaken2 = time4-time3;
long memoryTaken2 = freeMemory3 - freeMemory4;
System.out.println("Concat method  :" + "Time taken =" + timetaken2 +
                   " Memory Consumed =" + memoryTaken2);

结果

Concat operator: Time taken = 31; Memory Consumed = 2259096
Concat method  : Time taken = 16; Memory Consumed = 299592

如果concat()比运算符快,那么我们什么时候应该使用串联运算符(+)


答案 1

concat 方法始终生成一个包含串联结果的新字符串。

plus运算符由StringBuilder创建提供支持,将所需的所有字符串值追加到String()上调用它。

因此,如果您需要连接两个值,concat()将是更好的选择。如果需要连接 100 个值,则应使用 plus 运算符或显式使用 StringBuilder(例如,在循环中追加的情况下)。


答案 2

事实上,它们有很大的不同。s1 + s2s1.concat(s2)

s1 + s2由 javac 转换为

(new StringBuilder(String.valueOf(s1)).append(s2).toString();

如果.class反编译,您可以看到它。这种结构不是很有效;它最多涉及三个分配和三个复制操作。new char[]char[]

s1.concat(s2)始终是一个 + 一个复制操作,请参阅字符串.javanew char[]

public String concat(String str) {
    int otherLen = str.length();
    if (otherLen == 0) {
        return this;
    }
    char buf[] = new char[count + otherLen];
    getChars(0, count, buf, 0);
    str.getChars(0, otherLen, buf, count);
    return new String(0, count + otherLen, buf);
}

请注意,这是 的包私有构造函数。它直接使用,无需通常的复制,以确保不可变性的隐身性。new String(int, int, char[])Stringchar buf[]bufString


推荐