StringBuilder 与 StringWriter 和 PrintWriter 的字符串组装

新手上路,请多包涵

最近遇到一个没见过的成语: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 许可协议

阅读 577
2 个回答

在风格上, StringBuilder 方法更简洁。它的代码行更少,并且使用了专门为构建字符串而设计的类。

另一个考虑是哪个更有效率。正确的回答方法是对替代方案进行基准测试,但(基于源代码)我 希望 StringBuilder 更快。

A StringWriter 在引擎盖下使用 StringBuffer (而不是 StringBuilder )来“保存写入流的字符”。因此,使用 StringWriter 进行字符串汇编将产生 StringBuffer 的同步开销,无论您的应用程序是否需要它。但是如果你的应用程序 确实 需要同步,那么你应该考虑直接使用 StringBuffer


CPerkins 做了一些基准测试(参见 他的回答),他的结果与我的直觉一致。他们说最佳 StringBuilderStringWriter 之间的差异约为 5%,这对于 典型 应用程序1来说可能微不足道。然而,很高兴知道“风格”和“性能”标准给出了相同的答案!

1 - 虽然典型的应用程序不会花费大部分时间来组装字符串,但也有例外。但是,不应花时间纯粹基于猜测来优化这类事情。首先分析您的代码。

原文由 Stephen C 发布,翻译遵循 CC BY-SA 4.0 许可协议

StringWriter 是当你想写入字符串时使用的,但你正在使用需要 WriterStream 81a- 的 API这不是替代方案,而是妥协方案:只有在必须时才使用 StringWriter

原文由 Alan Moore 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题