代号一个StringBuilder与字符串之间的“ +”运算符

时间:2019-09-01 09:19:35

标签: codenameone

我注意到Oracle StringBuilderCodename One StringBuilder的Javadocs有所不同。例如,第一个不是线程安全的,第二个是线程安全的。

但是,我的问题是关于StringBuilder 的代号一个版本,尤其是关于不完整的句子,其中缺少示例:«使用了字符串生成器由编译器实现二进制字符串串联运算符+。例如,代码:被编译为等效于:»

所以,我的问题是在StringBuilder之间使用+代替String运算符是否没有任何优势。我注意到在Codename One来源中,您经常使用StringBuilder,但是在我的应用程序中,如果我串联一百个String或使用StringBuilder附加它们,则完全相同性能和内存方面的事情?即使在编译时不知道这些String的内容?

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

由于JVM中没有“字符串添加”功能,因此Java 8使用const useStyles = makeStyles({ card: { borderRadius: 0, backgroundColor: theme.palette.primary.light, color: theme.palette.primary.contrastText, boxShadow: "none" } }); a = b + c编译为字节码。 JIT对许多结果模式进行了特殊的优化(此处无关)。

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

我的规则是:循环添加后始终使用StringBuilder,否则就不用打扰了。