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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 悠然丶 中级黑马   /  2014-4-19 21:58  /  1465 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 悠然丶 于 2014-4-20 18:01 编辑

在书上看到这个题; 为什么在重写了equals()方法之后也必须重写hashCode()方法?
这个我也答不上来,求解!

5 个回复

倒序浏览
1、equals方法用于比较对象的内容是否相等(覆盖以后);

2、hashcode方法只有在集合中用到;

3、当覆盖了equals方法时,比较对象是否相等将通过覆盖后的equals方法进行比较(判断对象的内容是否相等)。

4、将对象放入到集合中时,首先判断要放入对象的hashcode值与集合中的任意一个元素的hashcode值是否相等,如果不相等直接将该对象放入集合中。如果hashcode值相等,然后再通过equals方法判断要放入对象与集合中的任意一个对象是否相等,如果equals判断不相等,直接将该元素放入到集合中,否则不放入。

评分

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

查看全部评分

回复 使用道具 举报
只要一个集合底层是通过哈希算法给元素指定内存位置,那么就必须复写以上两个方法
HashSet和HashMap底层都是通过哈希算法分配内存,又这两个集合元素是不可重复 无序的
那么我们怎么定义不可重复了?哈希地址 或者内容  因为会出现以下几种状况
1 哈希值相同 但是内容不同 是可以插入的  只是在这两个元素是以链表的形式存在
2 哈希值相同 但是内容也相同  都相同 当然是不允许插入的啦
3 哈希值不同 分配的内存位置肯定不同(哈希值其实就是内存的地址的一个十六进制表示)
,内容相同与否都是可以插入集合之中的
以上除了2 之外都是能插入元素的情况
我们要做的就是保证一个哈希地址值存放一个元素,1是可以存在,但是它的访问效率低,所以就不推荐这么干
,因此我们遵循的原则是 内容如果不同,保证哈希值也不同,不就可以实现我们的唯一地址唯一内容的目的了吗
,你会想上面那句话倒着说成立不,你再想如果哈希值不同了,还有比较内容的必要吗 肯定都能插入

评分

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

查看全部评分

回复 使用道具 举报 1 0
caijunsong 发表于 2014-4-19 22:33
只要一个集合底层是通过哈希算法给元素指定内存位置,那么就必须复写以上两个方法
HashSet和HashMap底层都 ...

恩 很详细,谢了
回复 使用道具 举报
  1. class Demo{
  2.         public static void main(String[] args){
  3.                 HashSet<String> hSet = new HashSet<String>();

  4.                 hSet.add("zxx");
  5.                 hSet.add("lhm");
  6.                 hSet.add("flx");

  7.                 Iterator<String> iterator = hSet.iterator();
  8.                 while(iterator.hasNext()){
  9.                         String name = iterator.next();
  10.                         System.out.println(name);
  11.                 }
  12.         }
  13. }
复制代码


HashSet和HashMap中,底层的数据结构是哈希表,元素存储是按哈希表中对应的值在集合中存储
哈希值为根据哈希函数计算得到的元素在内存中的地址值,因为不可以存储相同的元素,在添加元素时需要判断
因为计算出来的元素的哈希值有可能相同,所以还需要复写equals方法,判断元素的内容是否相同

存入元素时要先判断hashCode方法的值
如果元素的HashCode值相同,才会判断equals是否为true
如果元素的hashcode值不同,不会调用equals

评分

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

查看全部评分

回复 使用道具 举报
如果两个元素的hashcode不相同,那么肯定是不同的元素;如果两个元素的hashcode相同,那么不一定两个是不同的元素。两个不同的元素可能计算出来的hashcode是相同的。hash的作用在于快速检索,而不是单纯地为了判断对象的相等。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马