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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© Alexander 中级黑马   /  2014-3-4 15:01  /  974 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

记得刚开始学习Java时,遇到过这样一个问题,在重写equals()方法时最好重写hashCode()方法,当时不知道为什么,认为,既然equals()方法就可以判断两个对象是否相等,还要hashCode()干嘛,所以也就没在意,现在我想弄懂,hashCode()方法是干什么用的,一般用在什么地方?求高手解答啊!

评分

参与人数 1技术分 +1 收起 理由
zzkang0206 + 1

查看全部评分

4 个回复

倒序浏览
如果你学过数据结构的话,你就知道哈希值是什么东西了,简单的理解,就是为了方便添加和查找的。
以每一个对象对应的哈希值为地址标记,且尽量使hashCode的产生对于每一个对象来说唯一,这样就保证了存储与查找不需要遍历整个数组或是链表。
当要查找一个新对象时,先算其哈希值,然后根据哈希值可以直接知道其地址。
在JAVA中一般都是将可能存入HashSet或是HashMap的对象覆盖hashCode方法;

评分

参与人数 1技术分 +1 收起 理由
zzkang0206 + 1

查看全部评分

回复 使用道具 举报
应该是覆写hashCode()时,一般都覆写equals()方法,以防止查找hash表相同时,尽可能的比较不同之处

评分

参与人数 1技术分 +1 收起 理由
zzkang0206 + 1

查看全部评分

回复 使用道具 举报
这个问题一般应用在HashTreeSet中,因为HashTreeSet底层用到的数据结构是哈希表,而哈希表是先通过比较两个对象的哈希值,如果哈希值不一样,则各自存放。
        如果哈希值一样,则进一步比较对象中的内容是否一样,若内容不一样,则另一个对象顺延,共用一个哈希值存放。
    覆写hashCode方法,可以减少具有不同哈希值的多个对象进行比较次数,也就是说,有相同哈希值的对象需要调用equals方法进行比较。而哈希值不同的对象,不用再比较equals方法。

评分

参与人数 1技术分 +1 收起 理由
zzkang0206 + 1

查看全部评分

回复 使用道具 举报
     当向集合Set中增加对象时,首先集合计算要增加对象的hashCode码,根据该值来得到一个位置用来存放当前对象,挡在该位置没有一个对象存在的话,那么集合Set认为该对象在集合中不存在,直接增加进去。如果在该位置有一个对象存在的话,接着将准备增加到集合中的对象与该位置上的对象进行equals方法比较,如果该equals方法返回false,那么集合认为集合中不存在该对象,在进行一次散列,将该对象放到散列后计算出的新地址里,如果equals方法返回true,那么集合认为集合中已经存在该对象了,不会再将该对象增加到集合中了。   
     重写equals方法的时候必须重写hashCode方法。如果一个类的两个对象,使用equals方法比较时,结果为true,那么该两个对象具有相同的hashCode。原因是equals方法为true,表明是同一个对象,它们的hashCode当然相同。   
     Ojbect类的hashCode方法返回的是Object对象的内存地址。可以通过Integer.toHexString(new Object().hashCode);来得到。

评分

参与人数 1技术分 +1 收起 理由
zzkang0206 + 1

查看全部评分

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