【问题标题】:What are the best practices for building strings in the given situation with StringBuilder?在给定情况下使用 StringBuilder 构建字符串的最佳实践是什么?
【发布时间】:2013-04-09 19:34:10
【问题描述】:

我们正在构建一大块文本,并使用 StringBuilder 的单个实例。我们已将文本块分解为小节 (5),并为每个小节分配了相应的方法。每个方法都接受输入变量并输出文本。

最好将 StringBuilder 对象传递给每个方法,将数据附加到方法中并返回 void,还是让每个方法返回一个字符串,我们将其附加到较小函数之外的对象?

这两种想法有什么好处/缺点。

【问题讨论】:

  • 只是对答案的补充,您可以尝试猜测字符串的大小并使用StringBuilder(int capacity) 来避免调整大小的开销。另外为什么不使用模板引擎?

标签: java string stringbuilder


【解决方案1】:

我会传入 StringBuilder,并直接附加到它 - 假设您出于任何其他原因实际上不需要该中间字符串。

使用StringBuilder 的全部意义在于避免创建超出您需要的字符串。

只返回字符串的主要优点是,如果您想在 附加到 StringBuilder 的情况下使用相同的代码,它会更方便和惯用。但我假设这些实际上是从“构建文本”方法调用的私有方法,这使得它不再是一个问题。

Zim-Zam 关于并行性的观点很有趣,但我不会担心这一点,除非您实际上计划将其并行化。

【讨论】:

  • 我还想知道生成更干净的单元测试是否会更容易。我的第一直觉是让子集函数吐出一个字符串,因为我倾向于使用通用的可重用代码,但内存问题也是一个有效点。
  • @user1500053:如果您对这些方法进行单元测试,是否意味着它们不是私有的?
【解决方案2】:

传入 StringBuilder 更节省内存,因为不需要垃圾收集正在附加的字符串。返回字符串更适合并行化,因为字符串可以同时生成,然后按顺序附加。

【讨论】:

    【解决方案3】:

    编译器会检测到固定的文字,所以这里最好使用字符串

    String s1="str1"+"str2"+"str3";
    

    当需要动态追加字符串时,首选StringBuilder

    String s1="";
    s1+="str1";
    s1+="str2";
    s1+="str3";
    

    并使用 StringBuilder 的方法追加并最终转换为 toString();

    通过使用 + 稍后追加(编译器优化未完成)创建更多对象

    所以使用 StringBilder

    【讨论】:

      猜你喜欢
      • 2012-05-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多