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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 游兴钟 中级黑马   /  2012-4-13 14:18  /  1443 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

在视频中毕老师说String s=new String("abc")代表的是两个对象,请高手帮忙解说下这两个对象在内存中的生成过程。以及其间和变量s是一个怎样的关系。

8 个回复

倒序浏览
这个问题我刚问过。发帖前就麻烦搜索一下吧。

String s=new String("abc");这句话在栈堆内存开辟空间,栈内存中有一个变量s堆内存有一个"abc"
"abc"把地址值赋给变量s  变量s指向"abc"
回复 使用道具 举报
2个,因为java虚拟机的优化措施,在建立String实例对像时,虚拟机会先开辟一个一个字节大小的内存空间作为缓冲池,并会在缓冲池中查找是否有"xyz"这个实例对象,如果没有,那么虚拟机就会在缓冲池中创建,但是由于s是通过new关键字来创建的,所以java虚拟机又会以缓冲池中的"xyz"实例对象为源在内存中创建它的一个副本。因此String s = new String("xyz")实际在内存中创建了两个String实例对象。
回复 使用道具 举报
这 里 解 释 一 下黄 色这 3 个 箭 头, 对 于 通过 new 产 生 一 个 字符 串 ( 假 设 为”china”)时,会先去常量池中查找是否已经有了”china”对象,如果没有则 在常量池中创建一个此字符串对象,然后堆中再创建一个常量池中此”china”
对象的拷贝对象。这时创建了两个对象
回复 使用道具 举报
发错图片了,这个才是

评分

参与人数 1技术分 +2 收起 理由
贠(yun)靖 + 2 很给力!

查看全部评分

回复 使用道具 举报
不过String s=new String("abc")代表的也不一定是两个对象,如果常量池中没有“abc”那就是两个,有就是一个对象。
回复 使用道具 举报
未长法 发表于 2012-4-13 15:15
发错图片了,这个才是

通过Sting ="123"  Sting ="abc"  Sting ="uhy"这种方式创建的字符串对象都存放在常量池,而通过new(“abc”)这种方式创建的对象都存放在堆内存。我可以这么理解吗?
回复 使用道具 举报

    嗯,可以
回复 使用道具 举报
本帖最后由 achilles 于 2012-4-13 17:46 编辑
未长法 发表于 2012-4-13 17:15
嗯,可以

哦,看明白了  谢谢
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马