两个String对象相加就变成第三个对象了吗

public static void main(String[] args) {

String s3 = "你好吗";
    String s4 = "你";
    String s5 = "好吗";
    System.out.println(s3==(s4+s5));
    //s4+s5也是在字符串常量池中 为什么输出的是false?
}

s4+s5不在字符串常量池,它只是和常量池的“你好吗”正好相等。

为什么常量池已经有你好吗,这里还要再弄一个你好吗,两个不同的字符串?
这个你要理解,常量池的出现的目的,主要是加速程序的运行,在编译阶段能确定的字符串,先统统算出来,直接摆在程序里。
而运行的时候算出来的值,如果先查找下是不是常量池有没有,有的话引用常量池,那么这样做内存是节约了,但是性能反倒很差。
所以如果你是jvm的设计者,你应该怎么做?当然是不去判断是否存在,重复就重复好了。

首先String是final的,即不可变的,String类中每一个看起来修改String值的方法,内部实际上都是创建了一个StringBuilder对象,
并调用append()方法,最后调用toString()方法创建新的字符串对象,来包含修改后的字符串内容。你上面的s4+s5便是创建了
一个新的字符串对象,==比较的是字符串地址,两个对象地址当然不同了,所以是false,你可以用equals比较字符串内容便是true了。

==比较的是对象的索引值,比较常量值用:s3.equals(s4+s5)

java上引用类型用==号都会很坑,java的==号除了基本类型,其他引用类型比较的都是地址,即使你这样写

String s1 = "你";
String s2 = "你";
System.out.println(s1==s2);

结果也是false