所说的字符串常量池也是常量池中的一部分。
String str = "abc";
先检查字符串常量池是否存在对象"abc",
如果不存在,则在字符串常量池创建对象"abc",栈中的引用str再指向对象"abc"的地址;
如果存在,栈中的引用str直接指向对象"abc"的地址;
String str1 = "a" + "bc";
其中,"a"和"bc"都是字符串常量,所以编译器在编译字节码时,就优化成"ab",所以"ab"也是字符串常量;
str == str1 ,结果:true;
String str2 = new String("abc");
先检查字符串常量池是否存在对象"abc",
如果不存在,则在字符串常量池创建对象"abc",再在堆中创建对象new String("abc"),栈中的引用str指向堆里的对象String("abc")的地址,这种情况创建两个对象;
如果存在,在堆中创建对象new String("abc"),栈中的引用str指向堆里的对象String("abc")的地址,这种情况创建一个对象;
String str3 = "a" + new String("bc");
由于new String("bc")不是字符串常量,所以编译器在编译时期不能对它进行优化,创建对象"a","bc",再用(java5)StringBuilder调用append()连接"a","bc",最后调用StringBuilder的toString()创建对象"abc",引用str2指向的是新创建对象"abc"。
str2 == str3,结果:false