有关java语句创建几个对象的问题

String s1="a";
String s2=s1+"b";
String s3="a"+"b";
System.out.println(s2=="ab"); //false
System.out.println(s3=="ab"); //true
String s="a"+"b"+"c"+"d";
System.out.println(s=="abcd"); //true
我想知道一下这些输出结果的原因,谢谢!

当字符串做追加的时候,其实都是新创建了一个字符串,之后改变引用变量的指向,让他指向新的字符串

这个跟jvm的优化有关吧,虚拟机在编译的时候,如果运算符两边是字符常量,那么会再编译的时候就给他们作运算,因为是常量所以不会变了,是的吧,比如上边得s3="a"+"b";再编译时就进行了运算,
s3='ab';然后存在常量池中,所以s3='ab'为true;而如果是变量得话以后还有可能发生变化,所以虚拟机就不会再编译得时候进行优化。所以s2=s1+"b";s1是变量,在运行的s2=="ab"的时候,jvm就不会认为他们相等,
因为变量会变嘛,如果正好在运行==的时候发生了变化,那不是不相等了。然后s="a"+"b"+"c"+"d";同理。
希望有用

没一次new String的时候都是一个新的对象,你在用对象和变量操作的时候,实际上是指针的变化,具体的变量是没有改变的

以上问题归结到底是一个知识点 就是String s1="a"; 这一步 jvm干了啥
这一步 jvm在head中创建了一个变量s1 创建了一个字符串常量 “a”
同时把s1指向常量“a” 这个时候 请注意在内存中s1和“a”的地址并不
相等只是指向关系而已,所以s1+“b” 与内存中“ab”的地址并不一样
而关于String s2=“ab”;这一句 jvm会在内存中找是否有“ab”这个字符串
有就指向它 没有就创建

谢谢 如满意 请采纳

String s1="a";
String s2=s1+"b";
System.out.println(s2=="ab"); //false

上面这段:

内存中没有“a”,就创建 “a”,然后 s1指向它,
s1+“b”,没有“b”,就创建“b”,然后s2指向“a”+“b”,
判断那里,内存中并没有“ab”,没有怎么办,那就直接创建,
所以此时内存中会有:“a”,“b”,“ab”,三个不同的内存地址

那你的判断肯定就是false了

//对于常量'a'+'b',直接优化成"ab"
//对于变量 s1 + "b" ,虚拟机生成StringBuilder append之后,再toString(),会调用new String()
java.lang.String是个特殊的类,java虚拟机做了特殊的优化