[google/guava]自 Java 1.6 起更改 toString() 冗余使用 StringBuilder >

2018-07-30 430 views
3

从Java 1.6开始,加号运算符被编译器更改为StringBuilder。

回答

4

你假设

从Java 1.6开始,加号运算符被编译器更改为StringBuilder。

然而,编译器从 Java 9 开始就使用 invokedynamic 指令(好吧,Guava 还没有针对 Java 9+ 进行编译,但是未来呢?未来的 Java 版本使用与 invokedynamic 不同的东西呢?)

6

@ogregoire 恕我直言,这一切在这里都不重要。加号运算符被更改为某些内容,但这仅适用于单个表达式。也许甚至对于像这样的序列String s = ...; s += "a"; s += 5; ...,但不适用于包含像这里这样的条件的任意复杂的代码。对于 Java 8,有多个StringBuilder...

5

@Maaartinus 我的意思是今天正确的事情明天可能会变得错误。他的基本假设从 Java 6 开始+被翻译为StringBuilder's,append但在 Java 9 的 indy concat 中被证明是错误的。

8

@ogregoire 是的,事情总是在变化。但OP可以制定他的假设,例如+得到优化,但不清楚何时使用StringBuilder更快”。这种不确定性很可能会持续下去,我什至可以想象+获胜的情况,因为优化虚拟concat("(", a, ":", b, ")")比相应的字符串构建表达式更简单(作为一个极端,可以预先确定正确coder和准确count,并且可以在不复制的情况下重用数组)。不过这也太OT了吧……

2

我同意@MarkMielke:当前的代码按原样工作得很好,不需要在这里进行更改。