黑马程序员技术交流社区

标题: 关于String类的疑问? [打印本页]

作者: 孙国军    时间: 2012-4-13 15:29
标题: 关于String类的疑问?
Stirng s=new String("abc");
毕老师讲课的时候,说上面的代码在内存中存入了两个对象,
一个是 new
一个是 "abc"
不是太明白!!能不能请哪位大虾帮忙画一个在内存中操作的具体结构图以加深理解.
或者用文字讲解的详细点!!!
我:Q
作者: 薛飞飞    时间: 2012-4-13 15:47
2个或1个,因为java虚拟机的优化措施,在建立String实例对像时,虚拟机会先开辟一个一个字节大小的内存空间作为缓冲池,并会在缓冲池中查找是否有"xyz"这个实例对象:如果没有,那么虚拟机就会在缓冲池中创建,但是由于s是通过new关键字来创建的,所以java虚拟机又会以缓冲池中的"xyz"实例对象为源在内存中创建它的一个副本,这时String s = new String("xyz")实际在内存中创建了两个String实例对象;但是如果缓冲池中已经存在"xyz",那么虚拟机会直接在内存中创建1个副本,这时String s = new String("xyz")实际在内存中创建了1个String实例对象。
作者: newlaw2013    时间: 2012-4-13 16:20
本帖最后由 newlaw2013 于 2012-4-13 16:44 编辑

[attach]1842[/attach]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"的“门牌号”,自然找不到了





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