对于如下代码:
String s1 = "a";
String s2 = s1 + "b";
String s3 = "a" + "b";
System.out.println(s2 == "ab");//false
System.out.println(s3 == "ab");//true
至于为什么s2 == "ab" 为false,s3 == "ab";为true
在这里先讲一个点:
String s = new String("yy");
这相当于在java堆内存中创建一个对象,并且在常量池中也创建一个字符串对象。
String s = "a" + "b";
java的编译器会为该语句进行优化,变成String s = "ab";
所以在上述过程中:
s2 = s1 + "b";由于编译器不能在编译过程中确定s1的值,所以在这一步相当于String s2 = new String("ab");
所以s2对象是堆内存中的对象,所以与常量池中的"ab"对比,自然答案是false。下面可以通过一段代码说明。
把变量s1变成一个常量,编译器就能确定s1的值了,就能把s2 = s1 + "b";优化成s2 = "ab";所以答案也就是true了。