字符串的初始化可以通过2种方式,A.String a =“java”.
B String b = new String(“java”);
此时从虚拟机的角度来看,”java”是1个字面常量,它是存储在常量池种的,所以变量a指向常量池种的’java”的字符串。
String对象底层使用的是char[]数组存储的字符串,new String(“java”)的行为说明在堆中创建了1个新的String对象。细节就是b变量指向堆中的String对象,String对象里的char[]数组指向常量池种的”java”.
一个有趣但需要注意的情况:
String a = “hello”;
String b =”world”;
String c= a+b;
String d = “hello world”;
最终c==d吗? 答案是不等!
在JVM的编译阶段,字符串的连续动作最终会变成StringBuidler.append()操作并在最终调用StringBuilder.toString()方法返回1个对象,所以c指向在堆中新建的String对象,而d指向常量池中的字符串。
不过有种特殊情况,当上述a b都被final修饰的时候,JVM会进行优化,将变量的结果值直接赋值给c,即c==d,都指向常量池中的”hello world”.