通过了解String 类的不变性,您走在了正确的轨道上。
基于 [1] 和 [2],以下是推荐每种实现类型的一些情况:
1。简单的字符串连接
String answer = firstPart + "." + secondPart;
这是语法糖
String answer = new StringBuilder(firstPart).append("."). append(secondPart).toString();
这实际上非常高效,是简单字符串连接的推荐方法 [1]。
2。逐步构建
String answer = firstPart;
answer += ".";
answer += secondPart;
在引擎盖下,这转化为
String answer = new StringBuilder(firstPart).toString();
answer = new StringBuilder(answer).append(".").toString();
answer = new StringBuilder(answer).append(secondPart).toString();
这会创建一个临时的 StringBuilder 和中间的 String 对象,它们效率低下 [1]。尤其是在不使用中间结果的情况下。
在这种情况下使用StringBuilder。
3。用于循环构建和扩展以适应更大的集合
String result = "";
for(int i = 0; i < numItems(); i++)
result += lineItem(i);
return result;
上面的代码是 O(n^2),其中 n 是字符串的数量。这是由于 String 类的不变性,以及当连接两个字符串时,两个字符串的内容都会被复制 [2]。
所以对于一些固定长度的项目可能没问题,但它不会缩放。
在这种情况下,请使用StringBuilder。
StringBuilder sb = new StringBuilder(numItems() * LINE_SIZE);
for(int i = 0; i < numItems(); i++)
sb.append(lineItem(i));
return b.toString();
此代码是 O(n) 时间,其中 n 是项目或字符串的数量。
因此,随着字符串数量的增加,您会看到性能上的差异 [2]。
这段代码在StringBuilder的初始化中预先分配了一个数组,但是即使使用默认大小的数组,对于大量项目[2]来说,它也会比之前的代码快很多。
总结
如果您只连接几个字符串或性能不重要(即演示/玩具应用程序),请使用字符串连接。否则,使用StringBuilder 或考虑将字符串处理为字符数组[2]。
参考资料:
[1] Java 性能:Scott Oaks 的权威指南:Link
[2] Joshua Bloch 撰写的有效 Java 第 3 版:Link