下面关于String的测试,哪位大神能给出解答?

 public class StringDemo {
    String s1 = "123";
    String s2 = "12" + "3";
    String ss1 = "12";
    String ss2 = "3";
    String ss3 = ss1 + ss2;

    public void main() {
        System.out.println(s1 == s2);//true
        System.out.println(s1 == (ss1 + ss2));//false
        System.out.println(s1 == ss3);//false
    }

    public static void main(String[] args) {
        StringDemo sd = new StringDemo();
        sd.main();
    }
}

java编译器有优化,String s2 = "12" + "3";,因为都是常量,所以s2可以在编译的时候算出是"123",而程序中字符串常量会放在常量池里,相同的常量只需要一个拷贝,所以s1 == s2
s1 == (ss1 + ss2),其中ss1+ss2是运行时候才计算,并不能放在常量表里。
ss3是一样的道理,它虽然理论上也可以被求值出来,但是java编译器并没有做那样深度的优化,两个变量(变量本身指向常量)的计算,还是运行时才计算的。

java.String==是比较地址,s1==s2是因为java对字符直接量公用一个地址
https://www.cnblogs.com/tinyphp/p/3768214.html

参考:

https://stackoverflow.com/questions/767372/string-equals-versus

你打印一下 S1 S2的hashcode,应该是一样的。
而正确的 判断 字符串是否相等的应该是 Object 里面的 equals 方法。

应该java.String==是比较地址,s1==s2是因为java对字符直接量公用一个地址