Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
当Java编译器在一行中看到许多字符串连接时会发生什么?_Java_Performance_String_Concatenation - Fatal编程技术网

当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

假设我有一个Java表达式,例如:

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”)。