使用连接运算符(+)或String.format()方法进行字符串拼接

7

哪种方法更适合字符串连接?

如果我想从多个字符串变量(例如str1和str2)构建一个字符串,哪种方法会更好呢?

  1. 字符串连接运算符

String str="这是 String1 " + str1 + " 和 Sting2 " + str2 + " 合并后的字符串";

  1. 字符串格式化方法

String str=String.format("这是 String1 %s 和 Sting2 %s 合并后的字符串", str1, str2);

我认为第二种方法更好,因为第一种方法会创建大量字符串。

如果我错了,请纠正我,并提供反馈意见。


1
可能是重复的问题[在Java中使用String.format而不是字符串连接更好吗?](https://dev59.com/CnNA5IYBdhLWcg3whuZ_) - Reno
4个回答

9
第一个选项实际上不会创建任何额外的字符串。它将被编译成类似以下内容的东西:
String str = new StringBuilder("This the String1 ")
    .append(str1)
    .append(" merged with Sting2 ")
    .append(str2)
    .toString();

鉴于第二种形式需要解析格式字符串,如果第一种形式实际上运行更快,我不会感到惊讶。
但是,除非你有基准测试来证明这确实是一个运行速度太慢的代码片段,否则你不应该过于担心效率。你应该更关注可读性。哪一种代码更易读?

是的,尽量避免过早优化! - James Bassett
哇!了解到字符串连接运算符实际上是编译为 StringBuilder。从可读性的角度来看,显然第一个更好。 - ajduke

3
第一个不会受到字符串创建的影响。由于所有内容都是静态的,一个单独的 StringBuilder 被创建,所有部分被添加,然后调用 toString。相比之下,第二个要解析格式化字符串,效率稍低。但这可能并不是你在性能上输或赢的地方。
如果你在循环中进行字符串拼接,将会创建大量临时对象:
 for (String elem : someList) {
     s += elem;
 }

这将在每次迭代中创建一个StringBuilder和一个String对象。

1

这取决于你要连接的字符串数量。如果只有5(左右)个字符串,那么可能不会有影响。

针对你的具体情况进行衡量,是否真的需要这种优化。



网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接