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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 谭立文 于 2012-6-25 10:31 编辑

我定义了一个点类,然后重写了hashCode方法,然后用该点类new 对象时并没有发现hashCode方法被调用。
求高手。

2 个回复

倒序浏览
本帖最后由 韦念欣 于 2012-6-25 08:41 编辑

在new对象时,是不会调用hashCode方法的,只有我们使用到HashMap,HashSet集合来存储对象的时候,才会被调用。
因为这两个类使用到哈希表(即所谓的hash table),需要根据对象的哈希值得到它们所存储的位置。这个时候程序就需要通过调用hashCode方法得到对象的hash code(哈希值)。


当使用HashSet或HashMap时,hashCode方法就会被调用,判断已经存储在集合中对象的 hashCode值是否与要加入到集合中的hashCode值是否相同,如果不相同,则把元素加入进去,如果一致,再进行equals方法的比较,分成两种情况:

a,如果equals方法返回true,表示对象已经在集合之中,不会加入

b,如果equals方法返回false,表示对象不在集合之中,就会加入

所以,我们要是重写了hashCode方法也要重写equals方法,反之亦然

评分

参与人数 1技术分 +1 收起 理由
黄奕豪 + 1 赞一个!

查看全部评分

回复 使用道具 举报
哈希算法提高了从集合中查找元素的效率,这种方式经集合分成若干个存储区域,每个对象可以计算出一个“哈希码”,对哈希码进行分组,魅族分别对应某个存储区域,根据对象的哈希码就可以知道该随想存储在哪个区域。

HashSet就是采用哈希算法存储对象的集合,它内部采用对某个数字取余的方式对哈希码进行分组和划分存储区域。Object类中定义了一个hashCode方法来返回每一个java对象的哈希码,当从hashSet集合中查找元素时,java系统首先调用对象的hashCode方法获得对象的哈希码,然后根据哈希码找到还对象的存储区域,最后取出该区域的每一个元素与该对象进行equals方法比较,则按就不用遍历整个集合。可见HashSet集合具有较好的检索功能,但Hashset的存储效率要低些。

一般来说,如果一个类的两个对象的Equals比较为True时,这两个对象的hashCode()也相同,但hashCode()相同时,Equals()不一定为true。

当一个对象被存入HashSet后,就不能该这个对象中那些参与hashCode()的字段了,否则,对象修改后的哈希值与最初存入是的哈希值就不同了,在这种情况下,即使在Contains方法使用该对象的当前应用最为参数去HashSet中检索对象也将返回false,这也会导致无法从HashSet中单独删除该对象,从而造成内存泄露。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马