【https://www.toutiao.com/i6500028613331517965/】
对于字符串:其对象的引用都是存储在栈中的,如果是【编译期已经创建好(直接用双引号定义的)的就存储在常量池中】,如果是【运行期(new出来的)才能确定的就存储在堆中】。对于equals相等的字符串,在常量池中永远只有一份,在堆中有多份。
如以下代码:
Java代码
String s1 = "china";
String s2 = "china";
String s3 = "china";
String ss1 = new String("china");
String ss2 = new String("china");
String ss3 = new String("china");
String s=new String("china");
s 是对象的引用,存放在栈中,栈是存放基本类型的变量数据和对象的引用
new String("china");是对象本身(也就是对象),存放在堆(new 出来的对象) 。
"china" 存放在常量池,(字符串常量对象存放在常量池中) 。
这里解释一下黄色这3个箭头,对于通过new产生一个字符串(假设为”china”)时,会先去常量池中查找是否已经有了”china”对象,如果没有则在常量池中创建一个此字符串对象,然后堆中再创建一个常量池中此”china”对象的拷贝对象。
这也就是有道面试题:String s = new String(“xyz”);产生几个对象?一个或两个,如果常量池中原来没有”xyz”,就是两个。