Java中的字符串相加,内存怎么分配?

public class StringDemo {
    public static void main(String[] args) {
        String a = "hello ";
        String b = a + "world";
        String c = "hello " + "world";
        String d = "hello world";

        System.out.println(b == d); //false
        System.out.println(c == d); //true
    }
}
按照我的理解,直接对一个String对象赋值时,会将该值当作匿名对象保存到对象池(String b = a + "world";),
之后还有其他String对象也赋同样的值时(String c = "hello " + "world"; String d = "hello world";),
不会开辟新的内存空间,而是使用已有的对象进行引用的分配(b, c, d 都指向对象池中的同一块地址)。

但是实际效果是: c、d指向同一块内存,b指向另一块内存。

请问其中原理是什么?
查看回复