串联运算符 ( ) 与 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() 比运算符快,那么我们什么时候应该使用串联运算符 (+)

原文由 Sunil Kumar Sahoo 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 357
2 个回答

concat 方法总是生成一个带有连接结果的新字符串。

加号运算符由 StringBuilder 创建支持,附加您需要的所有 String 值并进一步调用 toString() 。

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

原文由 Artem 发布,翻译遵循 CC BY-SA 3.0 许可协议

事实上 s1 + s2s1.concat(s2) 是非常不同的。

s1 + s2 被javac转换成

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

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

s1.concat(s2) 总是一个 new char[] +一个复制操作,见String.java

 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[])String 的包私有构造函数。它直接使用 char buf[] ,没有通常的复制来确保 bufString 不变性的不可见性。

原文由 Evgeniy Dorofeev 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏