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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 罗力 中级黑马   /  2012-11-1 21:29  /  3058 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

hashCode方法的作用是什么?

评分

参与人数 1技术分 +1 收起 理由
唐志兵 + 1

查看全部评分

3 个回复

倒序浏览
hashcode()方法的作用是判断物理内存地址是否相等。

可以把hashcode理解为,一大片有编号的桶,如果你的散列算法好的话,可以保证每个不同的对象可以放在不同的桶里面,也就是每个不同的对象都有不同的HashCode(同上的编号)。这样的话,如果你旬找某个对象的时候,计算一下这个对象的hashcode然后直接就可以到对应的桶里面取道这个对象。


但是如果你的散列算法不好的话,也就是任何对象都有一个相同的hashCode,也就是说现在之后一个捅了,你所有的对象都要放在这个桶里面,这样的话,当你寻找某个对象的时候,虽然可以很快确定要去那个同里面寻找,但是如果桶里面有几千万个对象,那样的话你就需要逐个调用equals了。效率就太差了

评分

参与人数 1技术分 +1 收起 理由
唐志兵 + 1

查看全部评分

回复 使用道具 举报
1.hashcode是用来查找的 例如内存中有这样的位置
0 1 2 3 4 5 6 7
而我有个类,这个类有个字段叫ID,我要把这个类存放在以上8个位置之一,如果不用hashcode而任意存放,那么当查找时就需要到这八个位置里挨个去找,或者用二分法一类的算法。
但如果用hashcode那就会使效率提高很多。
我们这个类中有个字段叫ID,那么我们就定义我们的hashcode为ID%8,然后把我们的类存放在取得得余数那个位置。比如我们的ID为9,9除8的余数为1,那么我们就把该类存在1这个位置,如果ID是13,求得的余数是5,那么我们就把该类放在5这个位置。这样,以后在查找该类时就可以通过ID除8 求余数直接找到存放的位置了。

2.但是如果两个类有相同的hashcode怎么办那(我们假设上面的类的ID不是唯一的),例如9除以8和17除以8的余数都是1,那么这是不是合法的,回答是:可以这样。那么如何判断呢?在这个时候就需要定义 equals了。
也就是说,我们先通过 hashcode来判断两个类是否存放某个桶里,但这个桶里可能有很多类,那么我们就需要再通过 equals 来在这个桶里找到我们要的类。
那么。重写了equals(),为什么还要重写hashCode()呢?
想想,你要在一个桶里找东西,你必须先要找到这个桶啊,你不通过重写hashcode()来找到桶,光重写equals()有什么用啊
3。你要对A类排序,有两种方法,一种就是让A类实现comparabole结构并实现compareTo()方法,那么可以通过Collections.sort(List <A> list)对其进行排序
另一种方法:自己定义一个类B实现Comparator类并实现compare方法,
然后通过Collections.sort(List <A> list,B b)进行排序

hashCode() 是用来产生哈希玛的,而哈希玛是用来在散列存储结构中确定对象的存储地址的,象util包中的 带 hash 的集合类都是用这种存储结构 :HashMap,HashSet, 他们在将对象存储时(严格说是对象引用),需要确定他们的地址吧,而HashCode()就是这个用途的,一般都需要重新定义它的,因为默认情况下,由 Object 类定义的 hashCode 方法会针对不同的对象返回不同的整数,这一般是通过将该对象的内部地址转换成一个整数来实现的,现在举个例子来说, 就拿HashSet来说,在将对象存入其中时,通过被存入对象的 hashCode() 来确定对象在 HashSet 中的存储地址,通过equals()来确定存入的对象是否重复,hashCode() ,equals()都需要自己重新定义,因为hashCode()默认前面已经说啦,而equals() 默认是比较的对象引用,你现在想一下,如果你不定义equals()的话,那么同一个类产生的两个内容完全相同的对象都可以存入Set,因为他们是通过 equals()来确定的,这样就使得HashSet 失去了他的意义

评分

参与人数 1技术分 +1 收起 理由
唐志兵 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 王得新 于 2012-11-2 09:28 编辑

上个图看看
解释下: 首先肯定根据hashCode()方法算,哈希值不同就不看equals()方法了,直接存,如果相同!没有办法,只有找equals()方法了
用equals()方法比较时也要看,有没有覆盖Object中或父类中的equals()方法了,嗯!差不多就这样,自己再磨磨!

hashcode.png (21.94 KB, 下载次数: 40)

图解

图解

评分

参与人数 1技术分 +1 收起 理由
唐志兵 + 1

查看全部评分

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