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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 热血青年 中级黑马   /  2014-5-29 00:50  /  1434 人查看  /  15 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 热血青年 于 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,为什么?



15 个回复

倒序浏览
因为equals比较的是 toString()反回的哈希值!而哈希值好算是根把地址内存来算的,你new 了不同的对象,哈希值就不一样了,所以d1.equals(d2)反回为false;而==直接比较的是地址值,所以也是反回false:
不知道是不是这样,,不喜勿喷!
回复 使用道具 举报 1 0
对于引用数据类型,equals方法和==运算符比较的都是对象在堆内存中的首地址,d1和d2是两个不同的对象,在堆内存中的位置当然也不同,所以都为false
回复 使用道具 举报
        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: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:15
Student s1 = new Student("zhangsan",20);
Student s2 = new Student("zhangsan",20);
System.out.print ...

你那个类的源代码能发给我看一下吗?
回复 使用道具 举报
沉默的爱 发表于 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:30
public boolean equals(Object obj){

if(姓名和年龄相同)

我晕!我就知道,是这样,,你都重写一equals();方法了,,当然为true了,!!
回复 使用道具 举报
lin' 初级黑马 2014-5-29 08:37:24
9#
因为d1、d2都是空的,你new一个新的demo就是一个新的对象,当然是FALSE,再说你用equals,那是比较字符串
回复 使用道具 举报
1楼正解
回复 使用道具 举报
equals()方法在没有覆盖的情况下,时采用objec类中的equals方法,该方法在比较两个对象时默认返回false,而==直接比较两个对象在内存中的地址值。
回复 使用道具 举报
沉默的爱 发表于 2014-5-29 01:37
我晕!我就知道,是这样,,你都重写一equals();方法了,,当然为true了,!! ...

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

是这个道理~~~:)
回复 使用道具 举报
Aron 发表于 2014-5-29 23:18
这个是object中的equals方法
public boolean equals(Object obj) {
return (this == obj);

是吗??等等,,我再研究研究!!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马