【问题标题】:Codename One StringBuilder vs "+" operator between Strings代号一个 StringBuilder 与字符串之间的“+”运算符
【发布时间】:2019-12-15 09:38:47
【问题描述】:

我注意到Oracle StringBuilderCodename One StringBuilder 的Javadocs 存在差异。例如,第一个不是线程安全的,第二个是线程安全的。

但是,我的问题是关于 StringBuilder 的 Codename One 版本,特别是关于这个不完整的句子,其中缺少示例:«String builder are used by the编译器实现二进制字符串连接运算符+。例如,代码:被编译成等价于:»

所以,我的问题是在Strings 之间使用StringBuilder 而不是+ 运算符是否没有任何优势。我注意到,在 Codename One 来源中,您经常使用 StringBuilder,但在我的应用程序中,如果我连接一百个 String 或者如果我使用 StringBuilder 附加它们,在性能和记忆?即使这些Strings的内容在编译时是不知道的?

【问题讨论】:

  • 字符串之间的+= 运算符的相同问题。

标签: codenameone


【解决方案1】:

这是 JavaDocs 中的一个错误,可能是因为它们是以 StringBuffer 为起点派生的。 StringBuilder 不是线程安全的。我个人使用 + / += 运算符,它们在当前版本的 javac(当前是 Java 8+)中都非常有效。

StringBuilder 的优势在于,如果您有一些编译器无法检测到的东西。例如。如果您有一个字符串,该字符串的内容附加在相对较长的范围内,甚至超出了方法边界。在这种情况下,编译器将不得不创建多个StringBuilderString 实例,而不是StringBuilder 的单个实例。由于编译器进行了抽象,因此您需要猜测它的作用以及它的智能程度。

【讨论】:

    【解决方案2】:

    Java 8 使用 StringBuildera = b + c 编译成字节码,因为 JVM 中没有“字符串添加”。 JIT 对许多结果模式进行了特殊优化(此处不相关)。

    由于 CN1 以字节码开头(并且看不到源代码),因此结果必须相同。字节码总是为表达式分配一个StringBuilder 并使用生成的字符串。在循环中追加时,您可以通过跳过字符串并始终使用同一个构建器来做得更好。

    我的规则是:在循环中追加时始终使用StringBuilder,否则永远不要打扰。

    【讨论】:

      猜你喜欢
      • 2011-06-06
      • 2010-09-09
      • 2018-12-08
      • 1970-01-01
      • 2014-11-05
      • 2014-07-15
      • 2010-10-29
      • 2023-03-08
      相关资源
      最近更新 更多