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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© java冬冬 高级黑马   /  2013-5-11 12:48  /  1162 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 java冬冬 于 2013-5-11 19:25 编辑

为什么覆写equals()方法,就必须覆写hashCode()方法;而覆写hashCode()方法,可以不用覆写equals()方法。求一起为进黑马的同志们帮助解答!!

评分

参与人数 1技术分 +1 收起 理由
殇_心。 + 1

查看全部评分

3 个回复

倒序浏览
通常来说,一个类的两个实例对象用equals方法比较的结果相等时,他们的哈希码也必需相等,
但反之则不成立,即equals方法比较的结果不相等可以有相同的哈希码,或者说哈希码相同的两个
对象的equals方法比较结果可以不相等,例如,字符串“BB”和“Aa”的equals方法比较结果肯定不相等
但它们的hashcode方法返回值却相等。

评分

参与人数 1技术分 +1 收起 理由
殇_心。 + 1

查看全部评分

回复 使用道具 举报
首先要明白 hashmap 集合 存储元素的 原理 为什么 该集合能确保 存储的元素是唯一的 就是因为 当存进一个元素时 就会根据hashCode()算法算出该元素的哈希值 如果哈希值相同的  再进一步 用equals方法来做进一步的判断 如果仍相同 则不存 如果不同就存储  大多情况下 不同的元素哈希值有很小很小的概率相同 所以 了解了这个 问题就迎刃而解了
回复 使用道具 举报
首先,需要重写hashcode的前提是你得数据的存储时存放在哈希表中的。如果不是这样的话,其实没必要重写hashcode的。

放在HashMap和Hashtable里面如果是作为value而不是作为key的话也是不必重写 hashCode了。至于HashSet,实际上它只是忽略value的HashMap,每次HashSet.add(o)其实就是HashMap.put(o, dummyObject)。HashMap中的key是HashSet来实现的。它的存储方式是用哈希表来存储的。

因为每次get()和put()的时候HashMap既要看equals()是不是true也要看hashcode是不是一致。
每个对象都有一个哈希吗hashcode。相同的对象哈希吗hashcode一定相同,但有相同的哈希吗不一定是相同的对象。那么如果两个对象equals,那么他们的hashCode()必须相等;但hashCode()相等时,equals不一定要相等。

评分

参与人数 1技术分 +1 收起 理由
殇_心。 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马