黑马程序员技术交流社区

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

作者: 热血青年    时间: 2014-5-29 00:50
标题: equals和==的区别?
本帖最后由 热血青年 于 2014-5-29 22:13 编辑

引用数据类型的比较。

Demo d1 = new Demo();

Demo d2 = new Demo();



System.out.println(d1==d2);

System.out.println(d1.equals(d2));


两条输出语句的结果都是false,为什么?




作者: 沉默的爱    时间: 2014-5-29 00:58
因为equals比较的是 toString()反回的哈希值!而哈希值好算是根把地址内存来算的,你new 了不同的对象,哈希值就不一样了,所以d1.equals(d2)反回为false;而==直接比较的是地址值,所以也是反回false:
不知道是不是这样,,不喜勿喷!
作者: shisishishisi    时间: 2014-5-29 00:59
对于引用数据类型,equals方法和==运算符比较的都是对象在堆内存中的首地址,d1和d2是两个不同的对象,在堆内存中的位置当然也不同,所以都为false
作者: 沉默的爱    时间: 2014-5-29 01:08
        public static void main(String[] agrs)
        {
                Demo Demo1=new Demo();
                Demo Demo2=new Demo();
                System.out.println(Demo1.toString()+"        "+Demo2.toString());
        }
我建了一个空类Demo,然后new  了两个对象,打印它们的toString()
得到如下结果!
Demo@c17164        Demo@1fb8ee3

不一样吧!!似乎验证了我的观点!
作者: 热血青年    时间: 2014-5-29 01:15
沉默的爱 发表于 2014-5-29 01:08
public static void main(String[] agrs)
        {
                Demo Demo1=new Demo();

Student s1 = new Student("zhangsan",20);
Student s2 = new Student("zhangsan",20);
System.out.println(s1.equals(s2));
结果是true,为什么?
作者: 沉默的爱    时间: 2014-5-29 01:23
热血青年 发表于 2014-5-29 01:15
Student s1 = new Student("zhangsan",20);
Student s2 = new Student("zhangsan",20);
System.out.print ...

你那个类的源代码能发给我看一下吗?
作者: 热血青年    时间: 2014-5-29 01:30
沉默的爱 发表于 2014-5-29 01:23
你那个类的源代码能发给我看一下吗?

public boolean equals(Object obj){

if(姓名和年龄相同)
  return true;
return false;

}

Student s1 = new Student("zhangsan",20);
Student s2 = new Student("zhangsan",20);
System.out.println(s1==s2);
System.out.println(s1.equals(s2));
作者: 沉默的爱    时间: 2014-5-29 01:37
热血青年 发表于 2014-5-29 01:30
public boolean equals(Object obj){

if(姓名和年龄相同)

我晕!我就知道,是这样,,你都重写一equals();方法了,,当然为true了,!!
作者: lin'    时间: 2014-5-29 08:37
因为d1、d2都是空的,你new一个新的demo就是一个新的对象,当然是FALSE,再说你用equals,那是比较字符串
作者: jiang_ming    时间: 2014-5-29 08:42
1楼正解
作者: ↘ふ紫铯幽夢    时间: 2014-5-29 08:51
equals()方法在没有覆盖的情况下,时采用objec类中的equals方法,该方法在比较两个对象时默认返回false,而==直接比较两个对象在内存中的地址值。
作者: 热血青年    时间: 2014-5-29 21:34
沉默的爱 发表于 2014-5-29 01:37
我晕!我就知道,是这样,,你都重写一equals();方法了,,当然为true了,!! ...

:handshake
作者: Aron    时间: 2014-5-29 23:18
这个是object中的equals方法
public boolean equals(Object obj) {
return (this == obj);
    }
==就是比较2个栈中的引用是否指向一个堆中的对象。
有很多java的题目都是问equals和==的区别,其实两者区别并不大,Object类中
的equals就是实现的==判断,这个问题只对特定的类就不同了,比如String,List
等重写了equals方法的类,在这些类里面的equals比较的就是内容相同。
对于没有重写父类object中的equals方法的其实就和==没有区别 都是比较地址
如果重写了就按照你重写的来比较

作者: 吴海平    时间: 2014-5-29 23:35
路过~~~~
作者: 热血青年    时间: 2014-5-30 00:17
Aron 发表于 2014-5-29 23:18
这个是object中的equals方法
public boolean equals(Object obj) {
return (this == obj);

是这个道理~~~:)
作者: 沉默的爱    时间: 2014-5-30 03:38
Aron 发表于 2014-5-29 23:18
这个是object中的equals方法
public boolean equals(Object obj) {
return (this == obj);

是吗??等等,,我再研究研究!!




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