所说的字符串常量池也是常量池中的一部分。
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
本文详细解析了Java中字符串常量池的工作原理,包括不同方式创建字符串对象时的行为差异,如通过字面量和new关键字创建的区别,以及字符串拼接操作的影响。
1020

被折叠的 条评论
为什么被折叠?



