Java虚拟机对于字符串引用,由于在字符串的"+"连接中,有字符串引用存在,而引用的值在程序编译期是无法确定的,即I Love +s1中的s1无法被编译器优化,只有在程序运行期来动态分配并将连接后的新地址赋给s3和s4。所以上面程序的结果也就为s3中储存一个新地址,s4中储存另一个新地址。另外,string类型比较特殊,首先它会在常量池中寻找有没有这个值,也就是I Love imooc,如果有,则仅仅在堆内存中创建一个对象否则会创建两个对象,首先在常量池中一个,然后拷贝一个在堆内存,当然栈内存中的变量引用还是指向堆内存里面的对象。