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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 杨增坤 金牌黑马   /  2013-9-16 09:45  /  1273 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 杨增坤 于 2013-9-16 16:37 编辑

String s1="abc";String s2=new String("abc");


第一个在内存中有一个对象
第二个在内存中有两个对象。
他们的存储的结构是不是下图所示呢??请指教!


String初始化.png (24.55 KB, 下载次数: 13)

String初始化.png

评分

参与人数 1技术分 +1 收起 理由
张智文 + 1

查看全部评分

8 个回复

倒序浏览
好像不是吧?第一个是指针引用,第二个是一个对象。。。不是两个对象吧?
回复 使用道具 举报
本帖最后由 李锡碧 于 2013-9-16 11:03 编辑

是两个对象,我的理解是: (有点间接寻址的感觉~~{:soso_e141:})
也不知道是不是,目前我这么想的。楼主要是知道怎么理解是正确的一定要告诉我呀!{:soso_e100:}
回复 使用道具 举报
第一种方式:是直接将字符abc的地址赋给是S1,而第二种方式: 首先在堆内存中生成一个String对象,然后将String对象的地址赋给S2,然后又在堆内存中生成一个abc对象,而abc对象的地址不是直接的赋给S2,而是赋给了String对象,就相当与String对象中含有S2的地址。
我是这样理解的。。

回复 使用道具 举报
在java开发中,只要通过new关键创建的对象,都会在堆内存中动态分配一块内存。
String s2=new String("abc");
当程序运行到该句代码时,会在堆内存中分配一块内存控件,并在栈内存中创建一个引用变量s2。该变量存储的是刚才在堆内存中分配的内存控件首地址。

String s1="abc"; 当程序运行到该句代码时,会在内存的缓存区中创建一个x的字符串。而不是在堆内存中动态分配一块内存。

还有一点很重要,每次通过new创建的对象都会在堆内存中分配内存空间,
比如:
String s1=new String("abc");
String s2=new String("abc");
当程序执行完上面两句时,会在堆内存中创建两个x字符串对象,虽然他们的内容都相同,但他们却是不同的对象。你可以通过equal比较这两个对象的内容,还可以通过“==”比较两个对象首地址是否相同。

String s1="abc";
String s2="abc";

这只会创建一个abc字符串,当执行到第二句的时候,系统首先会去内存缓存区查找是否已经存在ab了,如果存在,则直接拿来用就ok,不需要重新创建。

希望对你有所帮助!

评分

参与人数 1技术分 +1 收起 理由
张智文 + 1

查看全部评分

回复 使用道具 举报
对于字符串:其对象的引用都是存储在栈中的,
如果是编译期已经创建好(直接用双引号定义的)的就存储在常量池中,
如果是运行期(new出来的)才能确定的就存储在堆中。
对于equals相等的字符串,在常量池中永远只有一份,在堆中有多份。
如以下代码:
这里解释一下黄色这3个箭头,对于通过new产生一个字符串(假设为”china”)时,
会先去常量池中查找是否已经有了”china”对象,
如果没有则在常量池中创建一个此字符串对象,然后堆中再创建一个常量池中此”china”对象的拷贝对象。
这也就是有道面试题:String s = new String(“xyz”);产生几个对象?一个或两个,
如果常量池中原来没有”xyz”,就是两个。

评分

参与人数 1技术分 +1 收起 理由
张智文 + 1

查看全部评分

回复 使用道具 举报
这个问题不必深究只要记住
String s1="abc";
是创建了一个对像——“abc”,因为对象都是放在堆内存中的所以“abc”在堆内存中,而s1是放在栈内存中的变量,这个变量中存放的是对象“abc”的地址值。
String s2=new String("abc");
是创建两个对象一个是new String();另一个是“abc”
s2与上面的s1一样都是变量放在了栈内存中,而new String和“abc”是放在堆内存中的
回复 使用道具 举报
2012 发表于 2013-9-16 12:02
在java开发中,只要通过new关键创建的对象,都会在堆内存中动态分配一块内存。
String s2=new String("ab ...

String s2=new String("abc");有两个对象,那是不是可以这样理解。
new 后,会在堆中创建了一个对象,也会在内存缓冲区中创建一个对象(前面不存在"abc")

String s1="abc";会在内存缓冲区中创建此对象,如果存在,则指向存在的!
回复 使用道具 举报
谢谢大家的解答,我明白了,大家辛苦了!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马