下面这条语句一共创建了多少个对象:String s="a"+"b"+"c"+"d";

答:对于如下代码:
String s1 = "a";
String s2 = s1 + "b";
String s3 = "a" + "b";
System.out.println(s2 == "ab");
System.out.println(s3 == "ab");
第一条语句打印的结果为false,第二条语句打印的结果为true,这说明javac编译可以对字符串常量直接相加的表达式进行优化,不必要等到运行期去进行加法运算处理,而是在编译时去掉其中的加号,直接将其编译成一个这些常量相连的结果。
题目中的第一行代码被编译器在编译时优化后,相当于直接定义了一个”abcd”的字符串,所以,上面的代码应该只创建了一个String对象。写如下两行代码,
String s ="a" + "b" + "c" + "d";
System.out.println(s== "abcd");
最终打印的结果应该为true。

这是JAVA面试题及答案,但不十分理解,谁能帮我解释一下,System.out.println(s2 == "ab");为什么返回false?

栈内存中存放引用变量--S1,S2和S3,堆内存中存放的是对象--a,b,c和d;
String s2 = s1 + "b",
理解为引用地址和堆地址的联合;
String s3 = "a" + "b",
理解为堆地址和堆地址的联合,即堆中“ab”的地址,
所以S2=“ab”为false;

为什么 s2 == "ab" “ab”是一个存放在常量池中的常量, s2 = s1 + "b" 因为String是final型的,任何对String的修改都会重新创建一个String对象,
所以s2是一个存放在堆内存的对象,==操作不仅判断值是否相等,还判断是否是同一个引用(即是否是同一个对象),这里s2和"ab"显然不是同一个对象
所以为false

从String作为对象理解下,==比较的是对象的地址,equals比较的才是对象的内容,在变量+字面量会生成新的对象

记好了 String 相当于final型的。实力化后是定常的,再➕的话 会重新创建String的

一共创建了3个对象s1,s2,s3