黑马程序员技术交流社区

标题: ==和equals的区别?没理解。。。 [打印本页]

作者: David.L    时间: 2014-7-18 18:25
标题: ==和equals的区别?没理解。。。
本帖最后由 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));
        }
               
}








作者: 郭良    时间: 2014-7-18 18:46
一个方法,一个符号,实质不同,具体用法具体讨论
作者: 孤守星空    时间: 2014-7-18 18:48
好像有对地址进行判断的
作者: 阿磊    时间: 2014-7-18 18:56
在String中,有覆写了Object里面的equals方法的,比较的是两个字符串是否一样,。而==呢则比较的是两个对象所指向的地址值。你的c和d分别new了两个对象,所以开辟了两个空间,所以地址值肯定是不一样的,但是c和d的内容却是一样的所以c==d是false。而c.equals(d)是true。
而在e和f中也是一样,你的==和equals都是针对引用型变量来进行比较,没有调用e.num,比较的是两个对象。
在这里==和上面一样,比较的是地址值。这里的equals用的是Object类中的比较方式,Demo并没有复写,所以还是以比较地址值的方式在比较,所以两个都是false
作者: 单线程xia    时间: 2014-7-18 19:27
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楼的来看,懒得打字了。。

作者: 新语新空    时间: 2014-7-18 19:56
楼上两个结合起来看很明白。简单来说,String复写了equals方法,所以,String类型的equals方法是比较内容是否相等,而==比较的是地址是否相等。而没有复写equals的Demo类比较的是地址是否相等,实际上等同于==。
作者: 人心如水    时间: 2014-7-18 20:04
好多人问这类问题,这个帖子的回答可以完美解决:D
作者: a191170796    时间: 2014-7-18 20:06
过来学习学习!!!
作者: 青程    时间: 2014-7-18 20:08
一个比地址,一个比内容
作者: 止询初衷    时间: 2014-7-18 21:50
我是路过的,。。。
作者: 南柯一梦    时间: 2014-7-18 22:15
String类的equals方法复写了Object类的equals比较方法,比较的是两个字符串是否相等,而==比较两个地址值是否相等,而Demo类继承Obje,Object默认equals方法底层也是==,所以,所以结果是false,true和false与fase
作者: 杨冬冬    时间: 2014-7-18 22:43
equals()原是object定义的方法,作用同符号“==”一样是比较的是地址,object 是所有类的父类,jdk中的类大部分都重写了equals()方法使其变成比较内容的方法,而上面的Demo是一个自定义类,不在jdk中,没有重写equals()方法,所以,System.out.println(e.equals(f));比较的是他们的地址值,不是其内容
作者: 歸羽    时间: 2014-7-18 22:45
一个比较的是内存中的地址值,一个复写了方法比较的是内容
作者: 歸羽    时间: 2014-7-18 22:46
一个比较的是内存中的地址值,一个复写了方法比较的是内容
作者: xwh1230    时间: 2014-7-18 22:46
兄弟, 在引用对象中==比较的是对象的地址值,所以,只有比较本身的时候才会是true,并不是值相等就true;equals默认使用的是==比较,而String类重写了equals()方法,这个方法时判断对象中的属性值是否相等,所以为true
作者: Adjin    时间: 2014-7-19 09:47
==和Object中的equals都比较的是地址
但是String中重写了equals,让它比较内容
作者: 微笑女皇    时间: 2014-7-19 16:04
学习了

作者: 签发    时间: 2014-7-19 16:18
equals是一个方法。==是一个运算符
作者: as_heima    时间: 2014-7-19 19:37
== 比较的是值的地址  equals比较的是值的本身




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