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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 清秋 黑马帝   /  2011-11-25 02:45  /  2389 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 清秋 于 2011-11-25 11:03 编辑

                        HashSet 保证元素唯一性
                        是通过元素的两个方法:hashCode和equals来完成
                        如果元素的HashCode值相同,才会判断equals是否为true
                        如果元素的HashCode值不同,不会调用equals

此处的HahCode值如何判断?复写hashCode方法的代码,nme.hashCode()是什么意思?
  1.         public int hashCode()
  2.         {
  3.                 System.out.println(this.name+"...hashCode");
  4.                 return name.hashCode()+age*39;
  5.         }
复制代码

5 个回复

倒序浏览
首先你得明白你重写的HashCode方法是比较什么的?是比较两个Person对象的,其中name是String型的,自身有个HashCode方法。
return name.hashCode()+age*39;意思就是说,返回name属性的哈希码加上age属性乘以39(可以随便+、-、*、/),也就是自己定义了一个Person对象的哈希码值。
不知道这么说你明白了没有。
回复 使用道具 举报
name是String型吧,age是int型吧,hashCode()是Object类的方法,作用是返回对象的哈希值,String重写了Object的hashCode()方法,只要String变量里的内容相同,就会返回相同的hashCode(),你这个列子是根据age和name来判断2个对象是否相同,因此hashCode值就应该和age和name相关。
回复 使用道具 举报
清秋 黑马帝 2011-11-25 11:02:14
板凳
风之末端 发表于 2011-11-25 10:52
name是String型吧,age是int型吧,hashCode()是Object类的方法,作用是返回对象的哈希值,String重写了Obje ...

谢谢了。应该是这样的吧。没有其他合理的解释
回复 使用道具 举报
张孝祥老师的讲解:
       hashCode方法是通过某种方式计算一个对象的hashCode值,参与计算的包括成员变量,实例对象在HashSet里存放时会按一定规则划分区域,hashCode值在相同范围的对象放在HashSet的同一区域,在查找比较时也只查找与比较对象在相同区域内是否相等。
  修改HashSet内对象的参与hashCode方法计算的成员变量值,可能导致内存泄露。

评分

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

查看全部评分

回复 使用道具 举报
Object类中的hashCode是返回对象在内存中地址转换成的一个int值(可以就当做地址看)。所以如果没有重写hashCode方法,任何对象的hashCode都是不相等的。通常在集合类的时候需要重写hashCode方法和equals方法,因为如果需要给集合类(比如:HashSet)添加对象,那么在添加之前需要查看给集合里是否已经有了该对象,比较好的方式就是用hashCode
equals()相等的两个对象,hashcode()一般是相等的,最好在重写equals()方法时,重写hashcode()方法; equals()不相等的两个对象,却并不能证明他们的hashcode()不相等。换句话说,equals()方法不相等的两个对象,hashcode()有可能相等。 反过来:hashcode()不等,一定能推出equals()也不等;hashcode()相等,equals()可能相等,也可能不等。在 object类中,hashcode()方法是本地方法,返回的是对象的引用(地址值),而object类中的equals()方法比较的也是两个对象的引用(地址值),如果equals()相等,说明两个对象地址值也相等,当然hashcode()也就相等了。
当hashCode不等的时候,向HashMap中存放值
Map map = new HashMap();
map.put(m1, m1);
map.put(m2, m2);
System.out.println(map.size());
System.out.println(map.containsKey(m1));
System.out.println(map.containsKey(m2));
会放入2个,就算equals是true
如果hashCode相等,会存放入1个:)



评分

参与人数 1技术分 +2 收起 理由
admin + 2 赞一个!

查看全部评分

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