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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 王洪波 于 2013-5-9 21:06 编辑

程序在执行new String("abc")时,是怎样分配内存空间的,最好附图说明下?

评分

参与人数 1技术分 +1 收起 理由
田磊阳 + 1

查看全部评分

8 个回复

倒序浏览
先占搂  出现两个对象   都在堆内存中
回复 使用道具 举报
每当执行一次new String("abc");时堆空间中会分配一块内存空间  里面存的是“abc”

Z1FL61JNB]4ESXN~`1%T~7B.jpg (7.85 KB, 下载次数: 1)

Z1FL61JNB]4ESXN~`1%T~7B.jpg

评分

参与人数 1技术分 +1 收起 理由
田磊阳 + 1

查看全部评分

回复 使用道具 举报

评分

参与人数 1技术分 +1 收起 理由
田磊阳 + 1

查看全部评分

回复 使用道具 举报
fjl_fight 发表于 2013-5-9 12:36

若是这样的话,str == str1会是true, 对吗?它们都指向了常量池中的“abc"
回复 使用道具 举报
String str1 = new String("abc");
String str2 = "abc";
String str3 = "abc";
两种的形式来创建,第一种是用new()来新建对象的,它会在存放于堆中。每调用一次就会创建一个新的对象。
而第二种是先在栈中创建一个对String类的对象引用变量str,然后查找栈中有没有存放"abc",如果没有,则将"abc"存放进栈,并令str指向”abc”,如果已经有”abc” 则直接令str指向“abc”。所以str1==str2的值为false,str3==str2的值为true,因为当str3引用的“abc”已近在栈内存中。忘说了, 栈有一个很重要的特殊性,就是存在栈中的数据可以共享。

评分

参与人数 1技术分 +1 收起 理由
田磊阳 + 1

查看全部评分

回复 使用道具 举报
金辉 发表于 2013-5-9 17:12
String str1 = new String("abc");
String str2 = "abc";
String str3 = "abc";

常量值"abc"存放到了栈中吗?
回复 使用道具 举报
王洪波 发表于 2013-5-9 17:59
常量值"abc"存放到了栈中吗?

对,栈中只有一个“abc”,str2与str3引用同一个“abc”
回复 使用道具 举报
你好,new String("abc")这句代码在内存中的执行其实不难。你不要把它想的太难了。
因为字符串在内存中会有专门的常量池来记住存储。所以,毫无疑问。先把“abc”作为字符串存起来。这个应该理解吧?
但是因为new String("abc")这是个匿名对象。而匿名对象是要在对内存中开辟空间的。所以它会在对内存中开辟空间。然后再次把“abc”存储起来。一共存两次、
一次作为字符串进常量池,一次作为对象进堆内存。希望你能理解

评分

参与人数 1技术分 +1 收起 理由
田磊阳 + 1

查看全部评分

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