直接甩代码
String s1 = "ab";
String s2 = "a" + "b";
String s3 = "a";
String s4 = "b";
String s5 = s3 + s4;
System.out.println(s1 == s2);
System.out.println(s1 == s5);
System.out.println(s2 == s5);
输出结果
true
false
false
我们将class文件转换成字节码
没有学过字节码指令可能看不懂一些jvm指令,这里的jvm指令很简单,对应的变量s1和s2的赋值过程,关键在于LDC指令,意思是将在范围-2147483648 ~ 2147483647之间的数压入栈中。但是这里出现的是字符串,其实这个跟工具翻译有关,但这不是本次讨论的重点,重点是"ab" "a" + "b" 在经过编译之后内容一致,此时s1和s2指向常量池中相同的位置,所以s1 = = s2为true
但是为什么后面两个输出为false呢? 我们继续看后面的字节码
虽然我们指令很长,对于新手来说不太友好,但是我们只需要关注重点,变量s5赋值时通过 new StringBuilder对象来构造字符串,所以后面两个输出为了false也很容易理解。