黑马程序员技术交流社区

标题: 请大神们帮忙解释一下吧……真没看懂 [打印本页]

作者: 黑马_白马    时间: 2014-6-7 23:38
标题: 请大神们帮忙解释一下吧……真没看懂
本帖最后由 黑马_白马 于 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, 下载次数: 87)

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

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

作者: GoodBoy123    时间: 2014-6-7 23:45
对啊,== 比较的是两个引用是否同属一个对象,可是这是两个对象,所以地址值不一样,就false
作者: 肥洋洋    时间: 2014-6-7 23:59
str是一个对象,abc是对象中的一个成员变量而已怎么会相等。这就相当于你拿一个人在和一个人身上的某个器官在比较
作者: felixzr    时间: 2014-6-8 00:07
比较的地址值不一样
作者: 来自沙沙的我    时间: 2014-6-8 00:12
String str2=“abc”;这里指的是先看内存中是否有abc这个对象,如果没有则创建一个
String str2 = new String("abc"); //而这里指的是不管内存中有没有豆创建一个abc对象,所以这里就有两个abc对象,一个是“abc”,一个是new String(“abc”)
    System.out.println(str2 == "abc");所以这里是false
改成这样
public class yy{
        public static void main(String[] args)
        {
       
        String str1 = new String("abc");
        String str2=str1;
            System.out.println(str2 == "abc");//flase
        System.out.println(str2 == str1);//true
        }
}
作者: 华绪海    时间: 2014-6-8 00:37
地址值不一样,而且有两个对象,所以结果为FALSE 是正确的。。。。
作者: xiazhixing    时间: 2014-6-8 09:25
学习了!
作者: 艮昕辶    时间: 2014-6-8 09:47
"abc"是常量池中的地址
str是堆内存存中的地址 是new出来的  只是所在地址数据等于"abc"

两个地址本来就不一样
你写==是比较地址
作者: 黑马_白马    时间: 2014-6-8 09:56
肥洋洋 发表于 2014-6-7 23:59
str是一个对象,abc是对象中的一个成员变量而已怎么会相等。这就相当于你拿一个人在和一个人身上的某个器官 ...

请问,STR2不是一个对象引用吗??
==左右两边应该比较的的是地址吧??
abc怎么又是对象的成员变量了?您能给解释一下吗?有点糊涂了
谢谢
作者: 黑马_白马    时间: 2014-6-8 09:59
艮昕辶 发表于 2014-6-8 09:47
"abc"是常量池中的地址
str是堆内存存中的地址 是new出来的  只是所在地址数据等于"abc"

您的意思是说,在堆地址内存中有常量池地址,还是常量池和堆是并列的存在呀?
作者: 黑马_白马    时间: 2014-6-8 10:01
xiazhixing 发表于 2014-6-8 09:25
学习了!

fighting:victory:
作者: 艮昕辶    时间: 2014-6-8 10:03
黑马_白马 发表于 2014-6-8 09:59
您的意思是说,在堆地址内存中有常量池地址,还是常量池和堆是并列的存在呀? ...

常量池是在栈中的我自己是这么认为的
不要说您我很菜的太客气了  说你就可以了
作者: 黑马_白马    时间: 2014-6-8 10:14
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 10:18
来自沙沙的我 发表于 2014-6-8 00:12
String str2=“abc”;这里指的是先看内存中是否有abc这个对象,如果没有则创建一个
String str2 = new Str ...

您回答的很详细。谢谢。:handshake
String str2 = new String("abc");这句话,一次性就会创建两个对象吗?我可以这样理解吗?
创建后new String("abc")在堆中,而“abc”是不是在常量地址池中?
作者: 江祖贇    时间: 2014-6-8 10:19
这样理解: new String("abc") == "abc"  绝对错  没错吧new 出来的都是一个新对象

作者: 黑马_白马    时间: 2014-6-8 10:20
艮昕辶 发表于 2014-6-8 10:03
常量池是在栈中的我自己是这么认为的
不要说您我很菜的太客气了  说你就可以了 ...

常量地址池 理论上说应该存在于堆中吧?因为栈中存储的不就只是一些引用吗?
作者: 艮昕辶    时间: 2014-6-8 10:24
黑马_白马 发表于 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:31
艮昕辶 发表于 2014-6-8 10:24
但是比如int x=1;char c='c';boolean b=false;String s="abc";
这里的1,c,false,"abc"都是常量啊  虽 ...

额,我也晕了。回头问问度娘或者Google大神吧~~~
谁先查出来了,就先回复吧。这样可以将知识共享。呵呵~
与君共同进步!
作者: sun_jun    时间: 2014-6-8 11:06
比较内容用equal
作者: 123_yaya    时间: 2014-6-8 11:19
表示涉及堆,栈,常量池的都有点晕晕的。。。。看答案来了。
作者: 会说话的木头    时间: 2014-6-8 11:58
肯定是false abc是字符串,str2是个变量名,指向一个对象,不能相等的
作者: 来自沙沙的我    时间: 2014-6-8 13:41
黑马_白马 发表于 2014-6-8 10:18
您回答的很详细。谢谢。
String str2 = new String("abc");这句话,一次性就会创建两个对象吗 ...

“abc”是个对象,str2指向的是new出来的另一个对象,也就是我之前说的srt1
作者: 来自沙沙的我    时间: 2014-6-8 13:43
str1也在栈中。但是它指向了新建的那个对象,也就是str2指向的那个对象,这样懂了吗?你之前那样写,创建的是一个匿名对象。
作者: 肥洋洋    时间: 2014-6-8 16:16
黑马_白马 发表于 2014-6-8 10:01
fighting

常量池是在方法区的,不在堆和栈中
作者: 黑马_白马    时间: 2014-6-8 23:48
来自沙沙的我 发表于 2014-6-8 13:41
“abc”是个对象,str2指向的是new出来的另一个对象,也就是我之前说的srt1

enen谢谢
作者: 黑马_白马    时间: 2014-6-9 00:05
123_yaya 发表于 2014-6-8 11:19
表示涉及堆,栈,常量池的都有点晕晕的。。。。看答案来了。

找到答案了吗~~~
转24L
作者: 黑马_白马    时间: 2014-6-9 00:09
来自沙沙的我 发表于 2014-6-8 13:43
str1也在栈中。但是它指向了新建的那个对象,也就是str2指向的那个对象,这样懂了吗?你之前那样写,创建的 ...

亲,你回复的是我的吗?:L
作者: 黑马_白马    时间: 2014-6-9 00:19
黑马_白马 发表于 2014-6-8 10:31
额,我也晕了。回头问问度娘或者Google大神吧~~~
谁先查出来了,就先回复吧。这样可以将知识共享。呵呵~
...

帖子更新了。可以看一下。




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