equals()和hashCode()是什么关系?

mic47 2010-11-19 09:48:31
重写了hashCode()方法,还用重写equals()吗?
那equals()不就是比较两个对象的hashCode()吗?
...全文
2248 28 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
28 条回复
切换为时间正序
请发表友善的回复…
发表回复
指尖上的行者 2011-08-07
  • 打赏
  • 举报
回复
[Quote=引用 24 楼 yzq_xiaoxian 的回复:]

引用 14 楼 totalball0226 的回复:
hashCode相等,equals不一定相等;
equals相等,hashCode一定相等。

可以这么理解吗?
[/Quote]
我也是这么理解的,呵呵
指尖上的行者 2011-08-07
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 djvfe 的回复:]

equals并不是自动比较的hashcode值,
在都不重写的时候
equals比较的是对象的内存地址
hashcode打印的也是对象的内存地址
所有看起来equals比较靠的是hashcode
其实可以不一样
[/Quote]
equals比较的不是对象的内容吗?好像“==”比较的才是内存地址吧
yzq_xiaoxian 2010-11-22
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 totalball0226 的回复:]
hashCode相等,equals不一定相等;
equals相等,hashCode一定相等。
[/Quote]
可以这么理解吗?
mic47 2010-11-21
  • 打赏
  • 举报
回复
不满意啊,再顶
tanzhoujavaeelover 2010-11-20
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 yaojianquansb 的回复:]
1、不重写equals方法,两个对象互相equals比较的是对象的地址;
2、集合里面元素,重写equals()的时候要重写hashcode(),如hashset、treeset、hashmap等;
[/Quote]

yaojianquansb 2010-11-20
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 mic47 的回复:]
什么是集合?collection吗?
引用 4 楼 yaojianquansb 的回复:
1、不重写equals方法,两个对象互相equals比较的是对象的地址;
2、集合里面元素,重写equals()的时候要重写hashcode(),如hashset、treeset、hashmap等;
[/Quote]
容器,collection是接口,为了判断往容器里面添加的元素是否重复,就是根据hashcode()和equals()来决定的
mic47 2010-11-20
  • 打赏
  • 举报
回复
讲的已经很好了,这个面试问题还不会吗?
那你怎么给我讲的。。[Quote=引用 7 楼 johnny1850 的回复:]
1.Object类的public boolean equals(Object obj)方法是通过 return this == obj;这种方式比较两个对象是否相同。这里比较的是引用。
2.Object类的public int hashCode()方法,是通过该实例地址转换为int值。所以不同的Object实例在同一运行期hashCode一定不相同。

以上两点是针对Object类本身说的,……
[/Quote]
mic47 2010-11-20
  • 打赏
  • 举报
回复
什么是集合?collection吗?
[Quote=引用 4 楼 yaojianquansb 的回复:]
1、不重写equals方法,两个对象互相equals比较的是对象的地址;
2、集合里面元素,重写equals()的时候要重写hashcode(),如hashset、treeset、hashmap等;
[/Quote]
plusplus2010 2010-11-20
  • 打赏
  • 举报
回复
不重写hashCode的时候,返回的通常是对象的内存地址,JDK文档原文是"typically implemented by converting the internal address of the object into an integer"。

另外,文档说,重写equals,就必须重写hashCode,因为hashCode规定,如果a.equals(b)==true,则必有a.hashCode()==b.hashCode()。原文是
" so as to maintain the general contract for the hashCode method, which states that equal objects must have equal hash codes."

不重写equals的时候,比较的是引用(Reference),也就是内存地址,见JDK的源码:


public boolean equals(Object obj) {
return (this == obj);
}


这个实现是符合上面的规定的。如果重写了equals,就有可能打破了上面的规定。这是因为,你自己定义的equals有可能让地址不同(也就是hashCode不同)的两个对象相等。所以要将hashCode一并重写。注意,这个关系是单向的,java并不要求hashCode相同的对象一定要相互equal。
lost_guy_in_scut 2010-11-20
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 tanzhoujavaeelover 的回复:]
引用 4 楼 yaojianquansb 的回复:
1、不重写equals方法,两个对象互相equals比较的是对象的地址;
2、集合里面元素,重写equals()的时候要重写hashcode(),如hashset、treeset、hashmap等;

[/Quote]
嗯嗯。
朽木可雕 2010-11-19
  • 打赏
  • 举报
回复

/**
*一般equals的效率能更高一些,比如
*hashcode就是简单的理解就是计算对象的权值(就是一种特殊值,只有内容相等的才会一样)
*而就是是在必须进行hashcode的时候才会去调用hashcode
*
*/
//比如这是一个hashcode算法,计算比较复杂吧
hashcode(){ return ((n*(n-1)+ n - (n - 1) ) + (n - 2) ..... - 1)}

equals (Object obj){
//判断引用是否相等,如果等就直接返回,不用计算hashcode的值
if( this == obj)
{
return true;
}
else{
if(obj instanceof this.getClass().getName())
{
//这里才真正计算hashcode ,所以效率比较高
if(this.hashcode() == obj.hashcode())
{
return ture;
}
else
{
return false;
}
}
else
{
return false;
}


}
}






个人看法,仅供参考
Dongo2 2010-11-19
  • 打赏
  • 举报
回复
楼上纯属菜鸟,乱扯。。。先搞明白什么是地址好吗?害人家可不好。。
下面这个这个比较严谨:
如果该对象没有重写object的equals方法,equals比较的是对象的hashcode。


totalball0226 2010-11-19
  • 打赏
  • 举报
回复
hashCode相等,equals不一定相等;
equals相等,hashCode一定相等。
yaojianquansb 2010-11-19
  • 打赏
  • 举报
回复
1、不重写equals方法,两个对象互相equals比较的是对象的地址;
2、集合里面元素,重写equals()的时候要重写hashcode(),如hashset、treeset、hashmap等;
djvfe 2010-11-19
  • 打赏
  • 举报
回复
equals并不是自动比较的hashcode值,
在都不重写的时候
equals比较的是对象的内存地址
hashcode打印的也是对象的内存地址
所有看起来equals比较靠的是hashcode
其实可以不一样
lodachi 2010-11-19
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 djvfe 的回复:]

equals方法最好要跟hashcode逻辑一致,即equals比较的是对象的hashcode
[/Quote]不是这样的,如果该对象没有重写object的equals方法,equals比较的是对象的hashcode。
djvfe 2010-11-19
  • 打赏
  • 举报
回复
equals方法最好要跟hashcode逻辑一致,即equals比较的是对象的hashcode
Jlins 2010-11-19
  • 打赏
  • 举报
回复
这个意思是对的
[Quote=引用 3 楼 djvfe 的回复:]
equals并不是自动比较的hashcode值,
在都不重写的时候
equals比较的是对象的内存地址
hashcode打印的也是对象的内存地址
所有看起来equals比较靠的是hashcode
其实可以不一样
[/Quote]
clariones 2010-11-19
  • 打赏
  • 举报
回复
比较两个对象的时候,会先比较 hashcode,如果不相等,再调用 equals()。 只要 Hashcode和 equals()有一个认为相等,就认为两个对象相等。

当然,这里不是指直接用 hashcode==hashcode,或者 直接调用 equals的地方,而是指系统内的一些实现,例如 HashMap中对key的比较。

所以,假设你需要用一个对象做key,默认的hashcode是不同的,你可以覆盖hashcode()这个方法,也可以覆盖 equals方法。 如果你覆盖了 hashcode方法,让他们相等,那么equals方法不会被调用;通常的做法是不覆盖hashcode方法,而是覆盖 equals方法。 这么做还有一个原因,hashcode通常只在生成对象时被调用一次。所以,如果这个对象不是一个不可修改对象,那么使用hashcode可能导致错误。
例如,使用 class { String a; int b} 的实例作为Key,K={a="hi", b=2}的对象的hashcode假设是 1000,然后用它做key, hashmap.put( K, "something");后,把改对象的成员 a 改为 其他值,例如 K.a="hello", 然后再用它做key,调用 hashmap.get(K), 你就会发现,即使是实际内容已经变了,但是还是返回“somnthing”。
加载更多回复(3)

62,635

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧