可能重复:
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);
我正在进行代码审查,所以我需要进行性能检查。 请任何人建议哪一个更好用。
答案 0 :(得分:7)
您应该使用StringBuilder
,因为每次向其添加内容时都不会涉及创建新的String
。
使用+
运算符连接两个String
,创建一个新的String
对象。
请注意,StringBuilder
和StringBuffer
之间的主要区别在于后者是同步的,因此通常比前者慢。
如果您有兴趣,请查看official documentation。
答案 1 :(得分:3)
对我而言,听起来你过早地进行了优化。
专注于编写易于理解和维护的代码。然后对其进行分析以发现瓶颈所在,然后进行优化。
您发布的两个版本之间的性能差异可能无关紧要。
P.S。无论如何,值得了解StringBuffer
和StringBuilder
之间的差异。见Difference between StringBuffer and StringBuilder class
答案 2 :(得分:2)
您可以使用StringBuilder
或StringBuffer
。 StringBuilder
对多个线程是线程安全的,StringBuffer
对单线程有用,可以提高单线程的执行速度。
答案 3 :(得分:1)
您可以使用StringBuffer或StringBuilder。区别在于StringBuffer是线程安全的。如果只在方法中使用它,你将选择StringBuilder。
答案 4 :(得分:1)
您应首先剖析代码并找到真正的性能值。在显示的代码部分使用StringBuilder可能会更快 - 但你总体上获得了多少?
答案 5 :(得分:1)
如果结果one
对于每次迭代都是相同的,则在循环之外预先生成它。然后你可以说one + lastIndex
而不用担心效率低下;它至少与显式使用缓冲区一样有效(CPUwise)。可能更多,因为你不是每次都从头开始重建字符串。它确实创建了一个半额外的String,但它或者是StringBuilder,所以。
如果index
,fundIndex
或CommonUtil.QUOTE_TREE_DOT
不断变化,您有两种选择:
String one = ...
。几乎任何其他解决方案都会产生额外的字符串。