关于两个字符串用加号链接

String s1="sss";
String s2="aaa";
String s3=s1+s2;
String s4="sss"+"aaa";app

问题一优化

System.out.println(s4=="sssaaa");//falsecode

问题二字符串

System.out.println(s3=="sssaaa");//true编译器

有一个东西叫作常量折叠,是一种编译器优化技术。编译

常量折叠有什么条件?
必须是编译期常量之间进行运算才会进行常量折叠。
编译期常量就是“编译的时候就能够肯定其值的常量”,并且这个认定比较严格。
首先:字面量是编译期常量。(数字字面量,字符串字面量等)
其次:编译期常量进行简单运算的结果也是编译期常量,如1+2,"a"+"b"。
最后:被编译器常量赋值的 final 的基本类型和字符串变量也是编译期常量。

对于问题(一)
 都是字符串字面量相加,都是编译期常量,都会被编译器进行常量折叠。class

对于问题(二)
 s3倒是两个非 final 的变量相加,因此不会进行常量折叠。
而是根据 String 类特有的 + 运算符重载,变成相似这样的代码
String s3 = new StringBuffer(a).append(b).toString();

这里toString()会生成新的String变量,显然用 == 运算符比较是会返回 false。变量