黑马程序员技术交流社区

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

作者: 游兴钟    时间: 2012-4-13 14:18
标题: 关于String的问题
在视频中毕老师说String s=new String("abc")代表的是两个对象,请高手帮忙解说下这两个对象在内存中的生成过程。以及其间和变量s是一个怎样的关系。

作者: 邱俊杰    时间: 2012-4-13 14:26
这个问题我刚问过。发帖前就麻烦搜索一下吧。

String s=new String("abc");这句话在栈堆内存开辟空间,栈内存中有一个变量s堆内存有一个"abc"
"abc"把地址值赋给变量s  变量s指向"abc"
作者: 薛飞飞    时间: 2012-4-13 14:54
2个,因为java虚拟机的优化措施,在建立String实例对像时,虚拟机会先开辟一个一个字节大小的内存空间作为缓冲池,并会在缓冲池中查找是否有"xyz"这个实例对象,如果没有,那么虚拟机就会在缓冲池中创建,但是由于s是通过new关键字来创建的,所以java虚拟机又会以缓冲池中的"xyz"实例对象为源在内存中创建它的一个副本。因此String s = new String("xyz")实际在内存中创建了两个String实例对象。
作者: 未长法    时间: 2012-4-13 15:15
这 里 解 释 一 下黄 色这 3 个 箭 头, 对 于 通过 new 产 生 一 个 字符 串 ( 假 设 为”china”)时,会先去常量池中查找是否已经有了”china”对象,如果没有则 在常量池中创建一个此字符串对象,然后堆中再创建一个常量池中此”china”
对象的拷贝对象。这时创建了两个对象
作者: 未长法    时间: 2012-4-13 15:15
发错图片了,这个才是
作者: 未长法    时间: 2012-4-13 15:18
不过String s=new String("abc")代表的也不一定是两个对象,如果常量池中没有“abc”那就是两个,有就是一个对象。
作者: 游兴钟    时间: 2012-4-13 16:58
未长法 发表于 2012-4-13 15:15
发错图片了,这个才是

通过Sting ="123"  Sting ="abc"  Sting ="uhy"这种方式创建的字符串对象都存放在常量池,而通过new(“abc”)这种方式创建的对象都存放在堆内存。我可以这么理解吗?
作者: 未长法    时间: 2012-4-13 17:15

    嗯,可以

作者: 游兴钟    时间: 2012-4-13 17:40
本帖最后由 achilles 于 2012-4-13 17:46 编辑
未长法 发表于 2012-4-13 17:15
嗯,可以

哦,看明白了  谢谢




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