我知道Javac编译器能够使用StringBuilder/StringBuffer来转换字符串连接符“+”,我很好奇这个更改是从哪个版本开始引入的?
我正在使用以下示例代码:
public class Main {
public static void main(String[] args) {
String a = args[0];
String s = "a";
s = s + a;
s = s + "b";
s = s + "c";
s = s + "d";
s = s + "e";
System.out.println(s);
}
}
到目前为止,我已经尝试使用 javac 1.8.0_121
、javac 1.6.0_20
、javac 1.5.0_22
和 java 1.4.2_19
。
这里是我使用来自 1.4.2_19
的 javap -c
看到的字节码示例:
6: astore_2
7: new #3; //class StringBuffer
10: dup
11: invokespecial #4; //Method java/lang/StringBuffer."<init>":()V
14: aload_2
15: invokevirtual #5; //Method java/lang/StringBuffer.append:(Ljava/lang/String;)Ljava/lang/StringBuffer;
18: aload_1
19: invokevirtual #5; //Method java/lang/StringBuffer.append:(Ljava/lang/String;)Ljava/lang/StringBuffer;
22: invokevirtual #6; //Method java/lang/StringBuffer.toString:()Ljava/lang/String;
所有4个版本似乎都在使用StringBuilder/StringBuffer优化,所以我很想知道从哪个Javac版本开始引入了这个更改?
String#+
而非StringBuilder
,导致我的Linux服务器和Java 8崩溃。我想要构建一个相当大(约300MB)的gnuplot文件。这其中涉及到一些逻辑,我需要同时构建两个150MB的字符串,并在最后将它们连接起来。使用String#+
花费了半个小时并且耗尽了所有可用内存。而使用StringBuilder
只需几秒钟并且占用更少的内存。 - Eric Duminil