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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© David.L 中级黑马   /  2014-7-18 18:25  /  2773 人查看  /  19 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 David.L 于 2014-7-18 18:26 编辑

下面代码运行结果为什么是这样?为什么一对是false和true,另一对确是2个都是false
false
true
false
false
-----------------------------------------------------------
class Demo
{
        private int num;
        Demo(int num)
        {
                this.num=num;
        }
}

class Day08
{
        public static void main(String[] args)
        {
                String c=new String("faa");
                String d=new String("faa");
                System.out.println(c==d);
                System.out.println(c.equals(d));
               
                Demo e=new Demo(4);
                Demo f=new Demo(4);
                System.out.println(e==f);
                System.out.println(e.equals(f));
        }
               
}







评分

参与人数 1黑马币 +5 收起 理由
人心如水 + 5 问的好,下面答的好

查看全部评分

19 个回复

倒序浏览
一个方法,一个符号,实质不同,具体用法具体讨论

点评

我是问为什么2组代码运行结果不一样哦,当然也问什么时候用哪个?  发表于 2014-7-18 21:25
回复 使用道具 举报
好像有对地址进行判断的
回复 使用道具 举报
在String中,有覆写了Object里面的equals方法的,比较的是两个字符串是否一样,。而==呢则比较的是两个对象所指向的地址值。你的c和d分别new了两个对象,所以开辟了两个空间,所以地址值肯定是不一样的,但是c和d的内容却是一样的所以c==d是false。而c.equals(d)是true。
而在e和f中也是一样,你的==和equals都是针对引用型变量来进行比较,没有调用e.num,比较的是两个对象。
在这里==和上面一样,比较的是地址值。这里的equals用的是Object类中的比较方式,Demo并没有复写,所以还是以比较地址值的方式在比较,所以两个都是false

评分

参与人数 1黑马币 +1 收起 理由
David.L + 1 很详细,理解了,谢啦

查看全部评分

回复 使用道具 举报
Object基类的equals()方法是 == 。
public boolean equals(Object obj) {
        return (this == obj);
    }

而String
public boolean equals(Object anObject) {
        if (this == anObject) {
            return true;
        }
        if (anObject instanceof String) {
            String anotherString = (String)anObject;
            int n = value.length;
            if (n == anotherString.value.length) {
                char v1[] = value;
                char v2[] = anotherString.value;
                int i = 0;
                while (n-- != 0) {
                    if (v1[i] != v2[i])
                        return false;
                    i++;
                }
                return true;
            }
        }
        return false;
    }

String里的equals方法已经override。

然后你结合3楼的来看,懒得打字了。。

评分

参与人数 1黑马币 +1 收起 理由
David.L + 1 赞一个!

查看全部评分

回复 使用道具 举报
楼上两个结合起来看很明白。简单来说,String复写了equals方法,所以,String类型的equals方法是比较内容是否相等,而==比较的是地址是否相等。而没有复写equals的Demo类比较的是地址是否相等,实际上等同于==。
回复 使用道具 举报
好多人问这类问题,这个帖子的回答可以完美解决:D
回复 使用道具 举报
过来学习学习!!!
回复 使用道具 举报
青程 中级黑马 2014-7-18 20:08:55
9#
一个比地址,一个比内容
回复 使用道具 举报
我是路过的,。。。
回复 使用道具 举报
String类的equals方法复写了Object类的equals比较方法,比较的是两个字符串是否相等,而==比较两个地址值是否相等,而Demo类继承Obje,Object默认equals方法底层也是==,所以,所以结果是false,true和false与fase
回复 使用道具 举报
equals()原是object定义的方法,作用同符号“==”一样是比较的是地址,object 是所有类的父类,jdk中的类大部分都重写了equals()方法使其变成比较内容的方法,而上面的Demo是一个自定义类,不在jdk中,没有重写equals()方法,所以,System.out.println(e.equals(f));比较的是他们的地址值,不是其内容
回复 使用道具 举报
一个比较的是内存中的地址值,一个复写了方法比较的是内容
回复 使用道具 举报
一个比较的是内存中的地址值,一个复写了方法比较的是内容
回复 使用道具 举报
兄弟, 在引用对象中==比较的是对象的地址值,所以,只有比较本身的时候才会是true,并不是值相等就true;equals默认使用的是==比较,而String类重写了equals()方法,这个方法时判断对象中的属性值是否相等,所以为true
回复 使用道具 举报
Adjin 中级黑马 2014-7-19 09:47:51
16#
==和Object中的equals都比较的是地址
但是String中重写了equals,让它比较内容
回复 使用道具 举报
学习了
回复 使用道具 举报
equals是一个方法。==是一个运算符
回复 使用道具 举报
== 比较的是值的地址  equals比较的是值的本身
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马