最近遇到一个没见过的成语:string assembly by StringWriter
and PrintWriter
。我的意思是,我知道如何使用它们,但我一直使用 StringBuilder
。是否有具体的理由偏爱其中一个? StringBuilder
方法对我来说似乎更自然,但这只是风格吗?
我在这里查看了几个问题(包括最接近的这个问题: StringWriter 或 StringBuilder ),但没有一个问题的答案真正解决了是否有理由在简单的字符串组装中更喜欢一个问题。
这是我见过并使用过很多次的成语:StringBuilder 的字符串组装:
public static String newline = System.getProperty("line.separator");
public String viaStringBuilder () {
StringBuilder builder = new StringBuilder();
builder.append("first thing").append(newline); // NOTE: avoid doing builder.append("first thing" + newline);
builder.append("second thing").append(newline);
// ... several things
builder.append("last thing").append(newline);
return builder.toString();
}
这是新的习惯用法:StringWriter 和 PrintWriter 的字符串组装:
public String viaWriters() {
StringWriter stringWriter = new StringWriter();
PrintWriter printWriter = new PrintWriter(stringWriter);
printWriter.println("first thing");
printWriter.println("second thing");
// ... several things
printWriter.println("last thing");
printWriter.flush();
printWriter.close();
return stringWriter.toString();
}
编辑 似乎没有 具体 的理由比另一个更喜欢一个,所以我接受了最符合我理解的答案,并对所有其他答案 +1。此外,我发布了自己的答案,给出了我运行的基准测试的结果,以回应其中一个答案。谢谢大家。
再次编辑 事实证明, 有 一个具体的理由比另一个更喜欢一个(特别是 StringBuilder)。我第一次错过的是换行符的添加。当你添加一个换行符时(如上所述,作为一个单独的附加),它会稍微快一些 - 不是很大,但加上意图的清晰度,它肯定会更好。有关改进的时间安排,请参阅下面的答案。
原文由 CPerkins 发布,翻译遵循 CC BY-SA 4.0 许可协议
在风格上,
StringBuilder
方法更简洁。它的代码行更少,并且使用了专门为构建字符串而设计的类。另一个考虑是哪个更有效率。正确的回答方法是对替代方案进行基准测试,但(基于源代码)我 希望
StringBuilder
更快。A
StringWriter
在引擎盖下使用StringBuffer
(而不是StringBuilder
)来“保存写入流的字符”。因此,使用StringWriter
进行字符串汇编将产生StringBuffer
的同步开销,无论您的应用程序是否需要它。但是如果你的应用程序 确实 需要同步,那么你应该考虑直接使用StringBuffer
。CPerkins 做了一些基准测试(参见 他的回答),他的结果与我的直觉一致。他们说最佳
StringBuilder
与StringWriter
之间的差异约为 5%,这对于 典型 应用程序1来说可能微不足道。然而,很高兴知道“风格”和“性能”标准给出了相同的答案!1 - 虽然典型的应用程序不会花费大部分时间来组装字符串,但也有例外。但是,不应花时间纯粹基于猜测来优化这类事情。首先分析您的代码。