黑马程序员技术交流社区

标题: 字符串理解问题 [打印本页]

作者: 关山明月    时间: 2015-3-23 23:18
标题: 字符串理解问题
本帖最后由 关山明月 于 2015-3-24 16:58 编辑

刚看到视频,讲String类
  1.                 String s1="abc";//s1是一个类类型的变量,"abc"是一个对象。
  2.                 String s2=new String("abc");

  3.                 //s1和s2的区别
  4.                 //s1在内存中有一个对象
  5.                 //s2在内存中有两个对象
复制代码

问题:1、"abc"这个对象也是存放在堆内存中吗?
2、s2在内存中有两个对象,一个是new String(),另一个是"abc",如果都是在堆内存中的话,那s2对应的是哪个对象的地址值(即指向哪个对象)?

作者: lmjssjj    时间: 2015-3-24 12:36
坐等大神            
作者: 圣光忏悔    时间: 2015-3-24 13:26
s1  "abc"是储存在字符串常量池里面的地址
S2 是造了一个新对象,new String()储存在栈内存中,然后栈内存的地址又指向字符串常量池"abc"的地址.
so

作者: 关山明月    时间: 2015-3-24 14:27
圣光忏悔 发表于 2015-3-24 13:26
s1  "abc"是储存在字符串常量池里面的地址
S2 是造了一个新对象,new String()储存在栈内存中,然后栈内存的 ...

new String()  是一个对象,不是应该储存在堆内存中吗?
作者: 圣光忏悔    时间: 2015-3-24 14:42
关山明月 发表于 2015-3-24 14:27
new String()  是一个对象,不是应该储存在堆内存中吗?

自己逗比把栈和堆弄混了....:L
作者: 剑雨飘扬    时间: 2015-3-24 14:44
关山明月 发表于 2015-3-24 14:27
new String()  是一个对象,不是应该储存在堆内存中吗?

应该是s2储存在栈内存中,new String()存在堆内存中,s2指向new String()吧?
作者: 关山明月    时间: 2015-3-24 16:10
圣光忏悔 发表于 2015-3-24 14:42
自己逗比把栈和堆弄混了....

呃,我还是没怎么明白,现在"abc"是在常量池中,new String()是在堆内存中,s2指向的是哪一个呢?new String() 和"abc"两者有什么关系吗?
作者: 剑雨飘扬    时间: 2015-3-24 16:21
关山明月 发表于 2015-3-24 16:10
呃,我还是没怎么明白,现在"abc"是在常量池中,new String()是在堆内存中,s2指向的是哪一个呢?new Str ...

s2是指向new String()啊,只不过newString()中的内容与常量池中的"abc"一样而已。
作者: 圣光忏悔    时间: 2015-3-24 16:24
关山明月 发表于 2015-3-24 16:10
呃,我还是没怎么明白,现在"abc"是在常量池中,new String()是在堆内存中,s2指向的是哪一个呢?new Str ...

栈  用来运行main主方法的,有对象就造对象
但是造的对象只是一个空壳子,里面是地址值指向别处,比如
s1 栈造出来了,s1 = "abc";
这是把常量"abc"赋值给s1 常量储存在方法区的字符串常量池里面,所以s1在栈内存中  实际里面是一个指向字符串常量池"abc"的地址值
String s2 = new String("abc");
s2栈造出来了
然后new String  由于是new  所以马上在堆内存开辟一开空间储存,
然后里面的值是"abc",所以,堆内存里面也是一个地址值,指向常量池.
所以之后是s2---指向堆---堆在指向常量池
作者: 圣光忏悔    时间: 2015-3-24 16:26
这是老师讲课画图的截图.

55.png (159.02 KB, 下载次数: 19)

55.png

作者: 关山明月    时间: 2015-3-24 16:39
圣光忏悔 发表于 2015-3-24 16:26
这是老师讲课画图的截图.

终于明白了,感谢感谢!:handshake
作者: 关山明月    时间: 2015-3-24 16:41
剑雨飘扬 发表于 2015-3-24 16:21
s2是指向new String()啊,只不过newString()中的内容与常量池中的"abc"一样而已。 ...

嗯嗯,看楼下的图明白了,感谢感谢!:handshake
作者: 关山明月    时间: 2015-3-24 16:43
圣光忏悔 发表于 2015-3-24 16:24
栈  用来运行main主方法的,有对象就造对象
但是造的对象只是一个空壳子,里面是地址值指向别处,比如
s1 栈 ...

:handshake  解释的很详细!
作者: xiaogougou    时间: 2015-3-24 17:31
解释的很好。。。赞!
作者: 冻了冬天    时间: 2015-3-24 18:15
多看看堆栈定义就知道。。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2