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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 孙国军 中级黑马   /  2012-4-13 15:29  /  1336 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

Stirng s=new String("abc");
毕老师讲课的时候,说上面的代码在内存中存入了两个对象,
一个是 new
一个是 "abc"
不是太明白!!能不能请哪位大虾帮忙画一个在内存中操作的具体结构图以加深理解.
或者用文字讲解的详细点!!!
我:Q

2 个回复

倒序浏览
2个或1个,因为java虚拟机的优化措施,在建立String实例对像时,虚拟机会先开辟一个一个字节大小的内存空间作为缓冲池,并会在缓冲池中查找是否有"xyz"这个实例对象:如果没有,那么虚拟机就会在缓冲池中创建,但是由于s是通过new关键字来创建的,所以java虚拟机又会以缓冲池中的"xyz"实例对象为源在内存中创建它的一个副本,这时String s = new String("xyz")实际在内存中创建了两个String实例对象;但是如果缓冲池中已经存在"xyz",那么虚拟机会直接在内存中创建1个副本,这时String s = new String("xyz")实际在内存中创建了1个String实例对象。

评分

参与人数 2技术分 +1 黑马币 +3 收起 理由
孙国军 + 3 赞一个!
贠(yun)靖 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 newlaw2013 于 2012-4-13 16:44 编辑

Stirng s=new String("abc");
new:在堆内存中创建一个空间,这个空间算是一个对象
将new生成的空间看成一个房间,“abc”就好比房间里面的东西(家具什么的),它们是String类型的。
"abc"也是一个对象。 图中的0X0089,是堆内存对象的地址值,好比房间的门牌号。
s 在栈内存中,s 的值就是0X0089。如果有谁想找这个"abc",按照“java的规定”,先到内存中找到s即可,s有"abc"的地址(s拿着"abc"所在房间的门牌号,
找这个地址去找,自然就找到了"abc"{:soso_e100:}
   注意绿色部分,s也可以不持有"abc"的地址,如果s = 0x0078,它就指向了"hello"所在的地址,这个时候,"abc"有可能还在堆内存中,但再想通过s
是找不到"abc"了,因为s已经没有"abc"的“门牌号”,自然找不到了

评分

参与人数 2技术分 +1 黑马币 +3 收起 理由
孙国军 + 3 赞一个!
贠(yun)靖 + 1

查看全部评分

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