Codename One StringBuilder 与字符串之间的“+”运算符
Codename One StringBuilder vs "+" operator between Strings
我注意到 Oracle StringBuilder
and of Codename One StringBuilder
的 Javadocs 有差异。比如第一个不是线程安全的,第二个是线程安全的。
但是,我的问题是关于 StringBuilder
的代号 One 版本,特别是关于这个不完整的句子,其中缺少示例:«编译器使用字符串生成器来实现二进制字符串连接运算符 +。例如,代码: 被编译为等效于:».
所以,我的问题是在 String
之间使用 StringBuilder
而不是 +
运算符是否没有任何优势。我注意到在 Codename One 来源中你使用了很多 StringBuilder
,但在我的应用程序中,如果我连接一百个 String
或者如果我使用 StringBuilder
附加它们是完全相同的在性能和内存方面的事情?即使编译时不知道这些String
的内容?
这是 Java 文档中的一个错误,可能是因为它们是从 StringBuffer
作为起点派生的。 StringBuilder
不是线程安全的。我个人使用 +
/ +=
运算符,它们在当前版本的 javac 中都非常有效(当前为 Java 8+)。
StringBuilder
的优点是如果你有编译器无法检测到的东西。例如。如果你有一个字符串,在一个相对较长的范围内附加了一些东西,甚至是一个超出方法边界的字符串。在这种情况下,编译器将不得不创建多个 StringBuilder
和 String
实例,而不是 StringBuilder
的单个实例。由于编译器抽象出你需要猜测它做了什么以及它有多聪明。
Java 8 使用 StringBuilder
将 a = b + c
编译成字节码,因为 JVM 中没有 "string addition"。 JIT 对许多结果模式进行了特殊优化(此处无关紧要)。
由于 CN1 以字节码开头(并且看不到源代码),因此结果必须相同。字节码总是为表达式分配 StringBuilder
并使用生成的字符串。在循环中附加时,您可以通过跳过字符串并始终使用同一个构建器来做得更好。
我的规则是:在循环中追加时始终使用 StringBuilder
,否则不要打扰。
我注意到 Oracle StringBuilder
and of Codename One StringBuilder
的 Javadocs 有差异。比如第一个不是线程安全的,第二个是线程安全的。
但是,我的问题是关于 StringBuilder
的代号 One 版本,特别是关于这个不完整的句子,其中缺少示例:«编译器使用字符串生成器来实现二进制字符串连接运算符 +。例如,代码: 被编译为等效于:».
所以,我的问题是在 String
之间使用 StringBuilder
而不是 +
运算符是否没有任何优势。我注意到在 Codename One 来源中你使用了很多 StringBuilder
,但在我的应用程序中,如果我连接一百个 String
或者如果我使用 StringBuilder
附加它们是完全相同的在性能和内存方面的事情?即使编译时不知道这些String
的内容?
这是 Java 文档中的一个错误,可能是因为它们是从 StringBuffer
作为起点派生的。 StringBuilder
不是线程安全的。我个人使用 +
/ +=
运算符,它们在当前版本的 javac 中都非常有效(当前为 Java 8+)。
StringBuilder
的优点是如果你有编译器无法检测到的东西。例如。如果你有一个字符串,在一个相对较长的范围内附加了一些东西,甚至是一个超出方法边界的字符串。在这种情况下,编译器将不得不创建多个 StringBuilder
和 String
实例,而不是 StringBuilder
的单个实例。由于编译器抽象出你需要猜测它做了什么以及它有多聪明。
Java 8 使用 StringBuilder
将 a = b + c
编译成字节码,因为 JVM 中没有 "string addition"。 JIT 对许多结果模式进行了特殊优化(此处无关紧要)。
由于 CN1 以字节码开头(并且看不到源代码),因此结果必须相同。字节码总是为表达式分配 StringBuilder
并使用生成的字符串。在循环中附加时,您可以通过跳过字符串并始终使用同一个构建器来做得更好。
我的规则是:在循环中追加时始终使用 StringBuilder
,否则不要打扰。