关于hashCode()和equals()的本质区别和联系

kingzhui005 2009-06-05 11:55:32
关于hashCode()和equals()的本质区别和联系
老师当时讲我没听多懂,
麻烦大家,
把所有跟这两个方法有关的知识都说说。、
非常感谢
...全文
120 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
Rangxing 2009-06-08
  • 打赏
  • 举报
回复
看JDK文档/...
longq121 2009-06-08
  • 打赏
  • 举报
回复
学习
Yedy2000 2009-06-08
  • 打赏
  • 举报
回复
mark
xjsglg 2009-06-08
  • 打赏
  • 举报
回复
1、首先equals()和hashcode()这两个方法都是从object类中继承过来的。
equals()是对两个对象的地址值进行的比较(即比较引用是否相同)。
hashCode()是一个本地方法,它的实现是根据本地机器相关的。

2、Java语言对equals()的要求如下,这些要求是必须遵循的:
• 对称性:如果x.equals(y)返回是“true”,那么y.equals(x)也应该返回是“true”。
• 反射性:x.equals(x)必须返回是“true”。
• 类推性:如果x.equals(y)返回是“true”,而且y.equals(z)返回是“true”,那么z.equals(x)也应该返回是“true”。
• 一致性:如果x.equals(y)返回是“true”,只要x和y内容一直不变,不管你重复x.equals(y)多少次,返回都是“true”。
• 任何情况下,x.equals(null),永远返回是“false”;x.equals(和x不同类型的对象)永远返回是“false”。

3、equals()相等的两个对象,hashcode()一定相等;
反过来:hashcode()不等,一定能推出equals()也不等;
hashcode()相等,equals()可能相等,也可能不等。


参考地址:http://honda418.javaeye.com/blog/342731
ZangXT 2009-06-07
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 rommal7090 的回复:]
另外若2个对象的hashcode相等则2个对象equals
[/Quote]
晕,正好说反了。
愤怒的月光 2009-06-07
  • 打赏
  • 举报
回复
Effective Java
讲得比较详细
equals()方法
1. 自反
2. 对称
3. 传递
4. 一致
5. X非空,x.equals(null)返回false

为了实现高质量的equals()改写,effective java提醒我们要注意一下几点:
1. 使用==操作符检查是否指向同一个对象,这是一个性能优化的手段。
2. 使用instanceof来检查是否为某个类,同样也是性能优化的手段。
3. 把实参转换到正确的类型,上面一步保证了这一步不会有错误。
4. 检查类里的每一个关键域是否都相等。

hashCode()则是一种计算 对象的散列值


任何 classes 如果复写了 equals(), 便应该同时也复写 hashCode()


这个正解,另外若2个对象的hashcode相等则2个对象equals
ageha67 2009-06-07
  • 打赏
  • 举报
回复
学习。。。。
blliy117 2009-06-05
  • 打赏
  • 举报
回复
Effective Java
讲得比较详细
equals()方法
1. 自反
2. 对称
3. 传递
4. 一致
5. X非空,x.equals(null)返回false

为了实现高质量的equals()改写,effective java提醒我们要注意一下几点:
1. 使用==操作符检查是否指向同一个对象,这是一个性能优化的手段。
2. 使用instanceof来检查是否为某个类,同样也是性能优化的手段。
3. 把实参转换到正确的类型,上面一步保证了这一步不会有错误。
4. 检查类里的每一个关键域是否都相等。

hashCode()则是一种计算 对象的散列值


任何 classes 如果复写了 equals(), 便应该同时也复写 hashCode()

maosenmin 2009-06-05
  • 打赏
  • 举报
回复
给你一个网上的参考:http://zhidao.baidu.com/question/47831363.html
http://lxj8495138.javaeye.com/blog/286024
lulu0126 2009-06-05
  • 打赏
  • 举报
回复
在判断对象或变量是否相等上得到结果是一样的!

请大虾们指正!
lulu0126 2009-06-05
  • 打赏
  • 举报
回复
个人意见:

equals()反映的是对象或变量具体的值。
而hashCode()是对象或变量通过哈希算法计算出的哈希值

APOLLO_TS 2009-06-05
  • 打赏
  • 举报
回复
如果出现 类名@23ac3265
那个@后的值就是散列码,你可以认为那个是对象的地址value
zhulin1113 2009-06-05
  • 打赏
  • 举报
回复
判断2个对象指向的地址是否相同,也就是2对象是否相等用hashcode
判断2个对象的值是否相等就用equals
简单的理解。。。

hashcode就相当于"=="
oklinsong 2009-06-05
  • 打赏
  • 举报
回复
用来判断两个对象是否相等,若相等则两个对象的hashcode 也是一样的。
阿里面试题及答案。HashMap有一个叫做Entry的内部类,它用来存储key-value对。 · 上面的Entry对象是存储在一个叫做table的Entry数组中。 · table的索引在逻辑上叫做“桶”(bucket),它存储了链表的第一个元素。 · key的hashcode()方法用来找到Entry对象所在的桶。 · 如果两个key有相同的hash值,他们会被放在table数组的同一个桶里面。 · key的equals()方法用来确保key的唯一性。 · value对象的equals()和hashcode()方法根本一点用也没有。 HashMap是基于哈希表实现的,每一个元素是一个key-value对,其内部通过单链表解决冲突问题,容量不足(超过了阀值)时,同样会自动增长。 HashMap是非线程安全的,只是用于单线程环境下,多线程环境下可以采用concurrent并发包下的concurrentHashMap。 HashMap 实现了Serializable接口,因此它支持序列化,实现了Cloneable接口,能被克隆。 HashMap存数据的过程是: HashMap内部维护了一个存储数据的Entry数组,HashMap采用链表解决冲突,每一个Entry本质上是一个单向链表。当准备添加一个key-value对时,首先通过hash(key)方法计算hash值,然后通过indexFor(hash,length)求该key-value对的存储位置,计算方法是先用hash&0x7FFFFFFF;后,再对length取模,这就保证每一个key-value对都能存入HashMap中,当计算出的位置相同时,由于存入位置是一个链表,则把这个key-value对插入链表头。

62,614

社区成员

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

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