最近在看字符串链接的问题想到字符串用+号链接。例如以下的代码
String s1 = "a";
String s2 = s1 + "b";
String s3 = "a" + "b";
System.out.println(s2 == "ab");
System.out.println(s3 == "ab");
第一条语句打印的结果为false,第二条语句打印的结果为true,这说明javac编译可以对字符串常量直接相加的表达式进行优化,不必要等到运行期去进行加法运算处理,而是在编译时去掉其中的加号,直接将其编译成一个这些常量相连的结果。
比如以下例子:
String str = "a";
str += "b";
此时不是简单得在常量池里面将a的字符串加上b就完事的,而是此时的str+="b";相当于str = new StringBuffer(str).append("b").toString();所以String每次用“+”链接都相当于在堆内存中先实例化一个StringBuffer然后再调用其append方法,最后调用toString方法转换成字符串。
所以如果“+”两边都是字符串的话,javac编译就会对字符串常量直接相加的表达式进行优化,不必要等到运行期去进行加法运算处理,而是在编译时去掉其中的加号,直接将其编译成一个这些常量相连的结果。而如果两边其中有一个是表达式的话javac编译就可能不会对字符串常量直接相加的表达式进行优化,需要等到运行时才会去进行运算,所以在第一条语句打印的结果为false,第二条语句打印的结果为true。