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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© yooc 中级黑马   /  2013-6-4 20:12  /  1532 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 yooc 于 2013-6-5 17:26 编辑
  1. String s1 ="abc";
  2. String s2 =new String("abc");
  3. String s3 ="abc";
复制代码
s1和s2为什么不相等?毕老师说s2有两个对象,能否用详细内存图解释下。
如果s2有两个对象,那么s2指向哪个?其实还是内存图,希望能画下。
s1和s3中的"abc"为同一个对象,那么s2中的"abc"呢?

问题较多,但不代表版主会多加技术分,希望大家以学习为目的认真交流,谢谢!

评分

参与人数 1技术分 +1 收起 理由
殇_心。 + 1

查看全部评分

6 个回复

倒序浏览
图不会上传,就说下吧:
1、你要始终记住一点,出现new 就是在堆内存中重新开辟一个空间来放东西的;
2、你说的相等,只是我们常人理解的值相等;这里不仅仅是值相等
3、根据第一条,s2 是new出来的,很明显s1和s2 他们的地址不一样,所以不相等;
4、s3 是将abc 那个地址进行了引用,也就是将s3指向了s1的abc的地址;

评分

参与人数 1技术分 +1 收起 理由
殇_心。 + 1

查看全部评分

回复 使用道具 举报
喜欢流浪 发表于 2013-6-4 20:39
图不会上传,就说下吧:
1、你要始终记住一点,出现new 就是在堆内存中重新开辟一个空间来放东西的;
2、你 ...



谢谢你的回答,尚有一些未解决。
怎么理解毕老师说的s2有两个对象?
s2作为一个引用指向哪个对象?
回复 使用道具 举报
yooc 发表于 2013-6-4 20:53
谢谢你的回答,尚有一些未解决。
怎么理解毕老师说的s2有两个对象?
s2作为一个引用指向哪个对象?

可以这么理解,对象s2 指向了 数组String[],String[]指向了abc。就相当于那个2维数组;这里的两个对象,是指abc 和String[];
我是这么理解的,如果不对了,可以指正!
回复 使用道具 举报
喜欢流浪 发表于 2013-6-4 20:59
可以这么理解,对象s2 指向了 数组String[],String[]指向了abc。就相当于那个2维数组;这里的两个对象, ...

我也不知道是不是这样
回复 使用道具 举报
String声明的字符串是放在常量池里的。声明s1 = "abc"时会在常量池开辟空间放入这个串值,当你再次声明s3 = "abc"的时候会先看常量池里是否有相同的字符串,没有的话才会创建新的字符串,所以这里s1和s3指向的是同一个字符串,它们在栈中的地址值也是相同的,所以s1 = s3,而声明s2的时候用到了new,这时就会在堆内存中开辟新的空间放入这个对象,s2指向这个对象,而对象中字符串的内容是"abc",它的内容指向了常量区,但是s2和s3的地址值是不同的,因为它们指向不同的对象,但是它们equals,因为它们的内容相同。希望你能明白。

无标题.png (18.54 KB, 下载次数: 0)

无标题.png

点评

答案采纳,感谢回答!  发表于 2013-6-5 17:25

评分

参与人数 1技术分 +1 收起 理由
殇_心。 + 1

查看全部评分

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