有关String内存分配问题

public static void main(String[] args) {

    String str = "Hello,World!";
    String s1 = "Hello,";
    String s2 = "World!";

    String s = "Hello," + "World!";

    String str2 = s1 + s2;

    System.out.println(str2 == str);
    System.out.println(s == str);
    System.out.println(str2 == s);
    System.out.println(s1 == "Hello,");
}

运行结果:
false 
true 
false
true

有人能解释下,s 与 str2 的内存分配情况吗?

str s1 s2 s 以及最后那个 "Hello," 都是常量,如果两个常量的字面值一样,在存储上实际上只有一份。
而str2不是常量,是程序运行的时候计算出来的,所以它参与的比较都是false

从java角度来说,每声明string类型都会创建一个新的对象,字符串拼接也是,创建新的对象,然后将指针指向声明对象。