从Java 1.6开始,加号运算符被编译器更改为StringBuilder。
Q
[google/guava]自 Java 1.6 起更改 toString() 冗余使用 StringBuilder >
3
A
回答
6
你假设
从Java 1.6开始,加号运算符被编译器更改为StringBuilder。
然而,编译器从 Java 9 开始就使用 invokedynamic 指令(好吧,Guava 还没有针对 Java 9+ 进行编译,但是未来呢?未来的 Java 版本使用与 invokedynamic 不同的东西呢?)
2
@ogregoire 恕我直言,这一切在这里都不重要。加号运算符被更改为某些内容,但这仅适用于单个表达式。也许甚至对于像这样的序列String s = ...; s += "a"; s += 5; ...
,但不适用于包含像这里这样的条件的任意复杂的代码。对于 Java 8,有多个StringBuilder
...
6
@Maaartinus 我的意思是今天正确的事情明天可能会变得错误。他的基本假设从 Java 6 开始+
被翻译为StringBuilder
's,append
但在 Java 9 的 indy concat 中被证明是错误的。
3
@ogregoire 是的,事情总是在变化。但OP可以制定他的假设,例如“+
得到优化,但不清楚何时使用StringBuilder
更快”。这种不确定性很可能会持续下去,我什至可以想象+
获胜的情况,因为优化虚拟concat("(", a, ":", b, ")")
比相应的字符串构建表达式更简单(作为一个极端,可以预先确定正确coder
和准确count
,并且可以在不复制的情况下重用数组)。不过这也太OT了吧……
4
4
我同意@MarkMielke:当前的代码按原样工作得很好,不需要在这里进行更改。