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, 下载次数: 86)

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

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

评分

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

查看全部评分

27 个回复

倒序浏览
对啊,== 比较的是两个引用是否同属一个对象,可是这是两个对象,所以地址值不一样,就false
回复 使用道具 举报 2 0
str是一个对象,abc是对象中的一个成员变量而已怎么会相等。这就相当于你拿一个人在和一个人身上的某个器官在比较
回复 使用道具 举报 1 0
比较的地址值不一样
回复 使用道具 举报 1 0
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
        }
}

评分

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

查看全部评分

回复 使用道具 举报 2 0
地址值不一样,而且有两个对象,所以结果为FALSE 是正确的。。。。
回复 使用道具 举报
学习了!
回复 使用道具 举报
"abc"是常量池中的地址
str是堆内存存中的地址 是new出来的  只是所在地址数据等于"abc"

两个地址本来就不一样
你写==是比较地址
回复 使用道具 举报
肥洋洋 发表于 2014-6-7 23:59
str是一个对象,abc是对象中的一个成员变量而已怎么会相等。这就相当于你拿一个人在和一个人身上的某个器官 ...

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

您的意思是说,在堆地址内存中有常量池地址,还是常量池和堆是并列的存在呀?
回复 使用道具 举报

fighting:victory:
回复 使用道具 举报
黑马_白马 发表于 2014-6-8 09:59
您的意思是说,在堆地址内存中有常量池地址,还是常量池和堆是并列的存在呀? ...

常量池是在栈中的我自己是这么认为的
不要说您我很菜的太客气了  说你就可以了
回复 使用道具 举报
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 00:12
String str2=“abc”;这里指的是先看内存中是否有abc这个对象,如果没有则创建一个
String str2 = new Str ...

您回答的很详细。谢谢。:handshake
String str2 = new String("abc");这句话,一次性就会创建两个对象吗?我可以这样理解吗?
创建后new String("abc")在堆中,而“abc”是不是在常量地址池中?
回复 使用道具 举报
这样理解: new String("abc") == "abc"  绝对错  没错吧new 出来的都是一个新对象
回复 使用道具 举报
艮昕辶 发表于 2014-6-8 10:03
常量池是在栈中的我自己是这么认为的
不要说您我很菜的太客气了  说你就可以了 ...

常量地址池 理论上说应该存在于堆中吧?因为栈中存储的不就只是一些引用吗?
回复 使用道具 举报
黑马_白马 发表于 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:24
但是比如int x=1;char c='c';boolean b=false;String s="abc";
这里的1,c,false,"abc"都是常量啊  虽 ...

额,我也晕了。回头问问度娘或者Google大神吧~~~
谁先查出来了,就先回复吧。这样可以将知识共享。呵呵~
与君共同进步!
回复 使用道具 举报
比较内容用equal
回复 使用道具 举报
表示涉及堆,栈,常量池的都有点晕晕的。。。。看答案来了。
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 加入黑马