A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 黑马-邢广耀 中级黑马   /  2012-12-26 08:59  /  1532 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

String str = "abc";
String str2 = "abc";
String str3 = str2;
String str4 = new String(abc);'
请问他们在内存中指向的是同一个对象吗?说明原因啊,否则会苦恼的。

评分

参与人数 1技术分 +1 收起 理由
古银平 + 1 神马都是浮云

查看全部评分

6 个回复

倒序浏览
前面3个指向的是同一个对象,因为他们都是在常量池中;最后一个会new出两个对象,与前3个是不同的对象
回复 使用道具 举报
这四个字符串都是同一个,只是指向了不同变量的引用而已,
当创建字符串的时候,字符串就被存入了一个"暂存池",如果以后需要创建同一个字符串的时候,就将暂存池内的相同字符串的引用赋给变量.
如果添加的是字符串中没有的字符串,就会将这个字符串添加到暂存池内,所以说字符串不存在修改,而"修改"只是将字符串的引用修改了而已
回复 使用道具 举报
String str = "abc";
String str2 = "abc";
String str3 = str2;
String str4 = new String(abc);
看指向的是否是一个对象要看对象是否相同,如果再次创建的对象相同时就不会再创建内容空间,而会指向第一次创建的内存空间。
“abc”对象在创建的时候已经开辟了内存空间,所以str和str2指向是相同的,其他的是不相同的。

回复 使用道具 举报
第一:对于 String str4 = new String("abc") ,只要是用new()来新建对象的,都会在堆中创建,而且其字符串是单独存值的,即使与栈中的数据相同,也不会与栈中的数据共享。new创建字符串时首先查看池中是否有相同值的字符串,如果有,则拷贝一份到堆中,然后返回堆中的地址;如果池中没有,则在堆中创建一份,然后返回堆中的地址

第二:对于String str = "abc"; 先定义一个名为str的对String类的对象引用变量:String   str;,然后,在栈中(字符串常量池)查找有没有存放值为 "abc "的地址,如果没有,则开辟一个存放字面值为 "abc "的地址,接着创建一个新的String类的对象s,并将s 的字符串值指向这个地址,而且在栈中这个地址旁边记下这个引用的对象s。如果已经有了值为 "abc "的地址,则查找对象s,并返回s的地址。最后,将s1指向对象s的地址。

故String str = "abc"; 线程池中没有,在线程池创建个
String str2 = "abc"; 在线程池中存在,直接把“abc” 地址付给str2
String str3 = str2;  把str2地址付给str3
String str4 = new String(“abc”); //你的问题里面,abc 没加“”,在堆内存中创建 ,把在线程池中的数据付给在对内存中开辟的空间,然后把地址返回给str4


回复 使用道具 举报
下面只是个人的见解,仅供参考:
(1):String str = "abc";这个字符串会在内存中开辟一个空间,可以理解成,“abc”就相当于是一个匿名的字符串对象。
(2):String str2 = "abc";这个字符串在开辟的时候,会先向内存中查找是否存在,结果在内存中已经存在了“abc”,所以会直接指向这个字符串。
(3):String str3 = str2;关于这个就好理解了,就是把str2的字符串地址直接赋给str3,str3当然指向str2的内容了。
(4):String str4 = new String(abc);这个就是最常见的了,实例化一个对象,开辟一个新的空间地址值。
举个例子,
String s=new String("xyz");这里面有几个对象?
我觉得,这里有两个对象,首先“xyz”这就是一个对象,是一个匿名对象;接下来new,又重新开辟了一个对象,分配了一个新的地址值,而先前的那个“abc”变成了垃圾,等待垃圾回收机制的处理。
回复 使用道具 举报
cyh8807 中级黑马 2012-12-30 14:11:32
7#
我个人感觉你的问题在内存中应该是这样分布的,由于 str ,str 2 ,str 3相当于是局部变量初始化,所以在栈内存中直接赋值了
而只有  str4 是引用类型的变量,下面附图供你参考,如分析不对,可以指出,大家共同学习

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马