当Java编译器在一行中看到许多字符串连接时会发生什么?
假设我有一个Java表达式,例如:当Java编译器在一行中看到许多字符串连接时会发生什么?,java,performance,string,concatenation,Java,Performance,String,Concatenation,假设我有一个Java表达式,例如: String s = "abc" + methodReturningAString() + "ghi" + anotherMethodReturningAString() + "omn" + "blablabla"; Java默认JDK编译器的行为是什么?它只是实现了五个串联,还是实现了一个智能性能技巧?它生成了以下等价物: String s = new StringBuilder("abc") .ap
String s = "abc" + methodReturningAString() + "ghi" +
anotherMethodReturningAString() + "omn" + "blablabla";
Java默认JDK编译器的行为是什么?它只是实现了五个串联,还是实现了一个智能性能技巧?它生成了以下等价物:
String s = new StringBuilder("abc")
.append(methodReturningAString())
.append("ghi")
.append(anotherMethodReturningAString())
.append("omn")
.append("blablabla")
.toString();
它足够聪明,可以预先连接静态字符串(即“omn”+“blabla”
)。如果需要,可以将StringBuilder
的使用称为“性能技巧”。对于性能而言,这肯定比执行五次串联(导致四个不必要的临时字符串)要好。另外,使用StringBuilder是(我认为)Java5中的性能改进;在此之前,使用了StringBuffer
编辑:正如注释中指出的,静态字符串只有在连接开始时才进行预连接。否则会破坏操作顺序(尽管在这种情况下,我认为Sun可以证明这一点)。鉴于此:
String s = "abc" + "def" + foo() + "uvw" + "xyz";
它的编译方式如下:
String s = new StringBuilder("abcdef")
.append(foo())
.append("uvw")
.append("xyz")
.toString();
+1.我看到了StringBuilder,并准备发布一个澄清,直到我找到底部,发现你已经处理好了。是的,我记不起哪一个是正确的,我必须在我的初始revision@Kip:与此相反,我使用Sun的JavaC1.6.0_15编译了代码,并通过jad(和javap)运行了.class它实际上编译为:
strings=(newstringbuilder())。附加(“abc”)。追加(methodReturningAString()。附加(“ghi”)。追加(AnotherMethodReturningString())。附加(“omn”)。附加(“blabla”)。toString()代码>在这种情况下,Sun编译器似乎不够聪明,无法预先连接静态字符串。@Kip:我使用内置于IBM RAD(基于Eclipse)中的编译器编译了相同的代码,并将其编译为:String s=(new StringBuilder(“abc”))。追加(methodReturningAString()。附加(“ghi”)。追加(AnotherMethodReturningString())。附加(“omn”)。附加(“blabla”)。toString()
仍然忽略了文本字符串优化,但至少使用第一个append()
able字符串创建了StringBuilder
。这与是否聪明无关。Java语言规范对求值顺序有非常具体的规则,即当所有运算符的优先级相同时,求值顺序必须从左到右。因此,尽管“foo”+“bar”+baz确实成为新的StringBuilder(“foobar”).append(baz),但如果不打破求值规则的顺序,foo+“bar”+“baz”无法编译成新的StringBuilder().append(foo).append(“barbaz”)。