我注意到Oracle StringBuilder
和Codename One StringBuilder
的Javadocs有所不同。例如,第一个不是线程安全的,第二个是线程安全的。
但是,我的问题是关于StringBuilder
的代号一个版本,尤其是关于不完整的句子,其中缺少示例:«使用了字符串生成器由编译器实现二进制字符串串联运算符+。例如,代码:被编译为等效于:»。
所以,我的问题是在StringBuilder
之间使用+
代替String
运算符是否没有任何优势。我注意到在Codename One来源中,您经常使用StringBuilder
,但是在我的应用程序中,如果我串联一百个String
或使用StringBuilder
附加它们,则完全相同性能和内存方面的事情?即使在编译时不知道这些String
的内容?
答案 0 :(得分:1)
这在JavaDocs中是一个错误,可能是因为它们是从StringBuffer
衍生而来的。 StringBuilder
不是线程安全的。我个人使用了+
/ +=
运算符,它们在当前版本的javac(当前为Java 8+)中都非常有效。
StringBuilder
的优点是,如果您有编译器无法检测到的内容。例如。如果您有一个字符串,它在相对较长的范围内附加了东西,甚至超出了方法边界。在这种情况下,编译器将必须创建多个StringBuilder
和String
实例,而不是单个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
,否则就不用打扰了。