哪种字符串连接技术在Java中更好?

时间:2012-12-21 10:13:05

标签: java string performance

  

可能重复:
  StringBuilder vs String concatenation in toString() in Java

在我的代码中,我使用String连接,如下所示。我正在进行代码审查,所以我需要进行性能检查。     请任何人建议哪一个更好用。

quoteTreeMap.put(index + CommonUtil.QUOTE_TREE_DOT + fundIndex + CommonUtil.QUOTE_TREE_DOT + lastIndex,buffer.toString());

所以我们反复使用

index + CommonUtil.QUOTE_TREE_DOT + fundIndex + CommonUtil.QUOTE_TREE_DOT + lastIndex

只有lastIndex此值会发生变化,所有人都保持不变。

如何编写代码以提供更好的性能? 我可以宣布

index + CommonUtil.QUOTE_TREE_DOT + fundIndex + CommonUtil.QUOTE_TREE_DOT

这就像

一样
String one=""index + CommonUtil.QUOTE_TREE_DOT + fundIndex + CommonUtil.QUOTE_TREE_DOT"

我可以将其用作one+lastIndex吗? 对于参考:

StringBuffer buffer = new StringBuffer();
buffer.append(CommonUtil.QUOTE_TREE_GROSS_PREM);
buffer.append(CommonUtil.QUOTE_TREE_SPACE);
buffer.append(CommonUtil.QUOTE_TREE_EQUALS);
buffer.append(CommonUtil.QUOTE_TREE_SPACE);
buffer.append(chcCalBreakDownObj.getPremium().getGrossPrem());
quoteTreeMap.put(index + CommonUtil.QUOTE_TREE_DOT + fundIndex + CommonUtil.QUOTE_TREE_DOT + lastIndex, buffer.toString());
lastIndex++;
clearBuffer(buffer);

我正在进行代码审查,所以我需要进行性能检查。 请任何人建议哪一个更好用。

6 个答案:

答案 0 :(得分:7)

您应该使用StringBuilder,因为每次向其添加内容时都不会涉及创建新的String

使用+运算符连接两个String,创建一个新的String对象。

请注意,StringBuilderStringBuffer之间的主要区别在于后者是同步的,因此通常比前者慢。

如果您有兴趣,请查看official documentation

答案 1 :(得分:3)

对我而言,听起来你过早地进行了优化。

专注于编写易于理解和维护的代码。然后对其进行分析以发现瓶颈所在,然后进行优化。

您发布的两个版本之间的性能差异可能无关紧要。

P.S。无论如何,值得了解StringBufferStringBuilder之间的差异。见Difference between StringBuffer and StringBuilder class

答案 2 :(得分:2)

您可以使用StringBuilderStringBufferStringBuilder对多个线程是线程安全的,StringBuffer对单线程有用,可以提高单线程的执行速度。

答案 3 :(得分:1)

您可以使用StringBufferStringBuilder。区别在于StringBuffer是线程安全的。如果只在方法中使用它,你将选择StringBuilder。

答案 4 :(得分:1)

您应首先剖析代码并找到真正的性能值。在显示的代码部分使用StringBuilder可能会更快 - 但你总体上获得了多少?

答案 5 :(得分:1)

如果结果one对于每次迭代都是相同的,则在循环之外预先生成它。然后你可以说one + lastIndex而不用担心效率低下;它至少与显式使用缓冲区一样有效(CPUwise)。可能更多,因为你不是每次都从头开始重建字符串。它确实创建了一个半额外的String,但它或者是StringBuilder,所以。

如果indexfundIndexCommonUtil.QUOTE_TREE_DOT不断变化,您有两种选择:

  • 使用StringBuilder通过多行生成结果,或
  • 在一行中完成所有连接。即:否String one = ...

几乎任何其他解决方案都会产生额外的字符串。