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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 黑马_白马 于 2014-6-9 00:25 编辑

String str2 = new String("abc");
    System.out.println(str2 == "abc");

步骤:
1) 栈中开辟一块空间存放引用str2;
2) 堆中开辟一块空间存放一个新建的String对象"abc";
3) 引用str2指向堆中的新建的String对象"abc";
4) str2所指代的对象地址为堆中地址,而常量"abc"地址在池中,输出为false;//为啥???

8Z(%R_Y3(MVJZSO)Z3WD6Z5.jpg (116.99 KB, 下载次数: 88)

刚找到的关于常量池的信息

刚找到的关于常量池的信息

评分

参与人数 1技术分 +1 收起 理由
轻语。 + 1

查看全部评分

27 个回复

正序浏览
黑马_白马 发表于 2014-6-8 10:31
额,我也晕了。回头问问度娘或者Google大神吧~~~
谁先查出来了,就先回复吧。这样可以将知识共享。呵呵~
...

帖子更新了。可以看一下。
回复 使用道具 举报
来自沙沙的我 发表于 2014-6-8 13:43
str1也在栈中。但是它指向了新建的那个对象,也就是str2指向的那个对象,这样懂了吗?你之前那样写,创建的 ...

亲,你回复的是我的吗?:L
回复 使用道具 举报
123_yaya 发表于 2014-6-8 11:19
表示涉及堆,栈,常量池的都有点晕晕的。。。。看答案来了。

找到答案了吗~~~
转24L
回复 使用道具 举报
来自沙沙的我 发表于 2014-6-8 13:41
“abc”是个对象,str2指向的是new出来的另一个对象,也就是我之前说的srt1

enen谢谢
回复 使用道具 举报

常量池是在方法区的,不在堆和栈中
回复 使用道具 举报
str1也在栈中。但是它指向了新建的那个对象,也就是str2指向的那个对象,这样懂了吗?你之前那样写,创建的是一个匿名对象。
回复 使用道具 举报
黑马_白马 发表于 2014-6-8 10:18
您回答的很详细。谢谢。
String str2 = new String("abc");这句话,一次性就会创建两个对象吗 ...

“abc”是个对象,str2指向的是new出来的另一个对象,也就是我之前说的srt1
回复 使用道具 举报
肯定是false abc是字符串,str2是个变量名,指向一个对象,不能相等的
回复 使用道具 举报
表示涉及堆,栈,常量池的都有点晕晕的。。。。看答案来了。
回复 使用道具 举报
比较内容用equal
回复 使用道具 举报
艮昕辶 发表于 2014-6-8 10:24
但是比如int x=1;char c='c';boolean b=false;String s="abc";
这里的1,c,false,"abc"都是常量啊  虽 ...

额,我也晕了。回头问问度娘或者Google大神吧~~~
谁先查出来了,就先回复吧。这样可以将知识共享。呵呵~
与君共同进步!
回复 使用道具 举报
黑马_白马 发表于 2014-6-8 10:20
常量地址池 理论上说应该存在于堆中吧?因为栈中存储的不就只是一些引用吗? ...

但是比如int x=1;char c='c';boolean b=false;String s="abc";
这里的1,c,false,"abc"都是常量啊  虽然他们没有final修饰
不是存放在栈中吗?  
回复 使用道具 举报
艮昕辶 发表于 2014-6-8 10:03
常量池是在栈中的我自己是这么认为的
不要说您我很菜的太客气了  说你就可以了 ...

常量地址池 理论上说应该存在于堆中吧?因为栈中存储的不就只是一些引用吗?
回复 使用道具 举报
这样理解: new String("abc") == "abc"  绝对错  没错吧new 出来的都是一个新对象
回复 使用道具 举报
来自沙沙的我 发表于 2014-6-8 00:12
String str2=“abc”;这里指的是先看内存中是否有abc这个对象,如果没有则创建一个
String str2 = new Str ...

您回答的很详细。谢谢。:handshake
String str2 = new String("abc");这句话,一次性就会创建两个对象吗?我可以这样理解吗?
创建后new String("abc")在堆中,而“abc”是不是在常量地址池中?
回复 使用道具 举报
GoodBoy123 发表于 2014-6-7 23:45
对啊,== 比较的是两个引用是否同属一个对象,可是这是两个对象,所以地址值不一样,就false ...

嗯嗯!学习了。谢谢。
我可以这样理解吗?就是==比较的是两边是否属于同一个对象,而new String("abc");则一次性创建了两个对象。一个是“abc”;一个是new String("abc");而STR2指向了new String("abc"),所以说白了str2里面存储的是new出来的地址,而“abc”则是在内存中的另外一个地址。
我还想问一下,在内存地址中,除了栈堆,是不是还有常量地址池??而“abc”就存储其中?
回复 使用道具 举报
黑马_白马 发表于 2014-6-8 09:59
您的意思是说,在堆地址内存中有常量池地址,还是常量池和堆是并列的存在呀? ...

常量池是在栈中的我自己是这么认为的
不要说您我很菜的太客气了  说你就可以了
回复 使用道具 举报

fighting:victory:
回复 使用道具 举报
艮昕辶 发表于 2014-6-8 09:47
"abc"是常量池中的地址
str是堆内存存中的地址 是new出来的  只是所在地址数据等于"abc"

您的意思是说,在堆地址内存中有常量池地址,还是常量池和堆是并列的存在呀?
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 加入黑马