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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© whocases 黑马帝   /  2012-6-23 22:40  /  3109 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 whocases 于 2012-6-28 19:42 编辑

在创建一个HashMap集合时,重写hashCode()和equals()方法,运行的顺序是怎样的?

7 个回复

倒序浏览
跟hashset是差不多的,因为底层是哈希表结构的,先判断地址值,所以都是先重新hashcode保证地址值的相同,然后再判断equals判断里面的元素,我是这么理解的。。
回复 使用道具 举报
本帖最后由 黑马张扬 于 2012-6-23 23:22 编辑

判断两个对象是否相等的规则是:
1,判断两个对象的hashCode是否相等
      如果不相等,认为两个对象也不相等,完毕
      如果相等再用equals判断
2,判断两个对象用equals运算是否相等
      如果不相等,认为两个对象也不相等
      如果相等,认为两个对象相等(equals()是判断两个对象是否相等的关键)
回复 使用道具 举报
equals()和hashCode()都来自java.lang.Object,为了维护 hashCode 方法的常规协定,才要求用equals比较的两个对象的hashCode相同
equals():仅当的内存地址相等时,才返回true
hashCode():hashCode()的值也是与内存地址相关的.所以仅当内存地址相等时,hashCode才相等
回复 使用道具 举报
     重写hashCode()时最重要的原因就是:无论何时,对同一个对象调用hashCode()都应该生成同样的值。如果在将一个对象用put()方法添加进HashMap时产生一个hashCode()值,而用get()取出时却产生了另外一个 hashCode()值,那么就无法重新取得该对象了。
   
   首先判断两个对象的 hashCode 是否相等,如果不相等,认为两个对象也不相等,反之如果相等,则用equals()比较。
用equals()比较时,如果不相等,认为两个对象也不相等 ,如果相等,认为两个对象等!
所以在比较对象是否相等时有个顺序,先比较的是对象的hashcode()在用equals()比较
回复 使用道具 举报
附上部分代码进行分析:
这里我们定义一个学生类,里面的属性为姓名,年龄。确保学生的唯一性。

那么我们现在打个假设:当两个学生的姓名相同,年年龄不同视为不同的人,
                                 当姓名相同,年龄也相同视为同一个人。

public int hashCode()//复写底层hashCode方法。
{
  return name.hashCode()+age*67;//name是String类,它里面有自己的hashcode方法。这里判断的就是他们的姓名对应的哈希值是否相同,那么当他们的hashCode()相同时,
                                                   //那么我们就要判断次要元素,年龄是否相同。就是比较equals方法。
}
public boolean equals(Object obj)//那么我们就会调用equals方法,来判断他们是否是同一个学生。
                                                 //那么我们总结一下就是:当判断两个元素是否相同,会先比较他们的hashcode是否相同,当他们相等时,如果有次要元素存在的话,那么就
                                                 //会调用equals方法来比较来判断是否是同一个元素。当hashcode不相同的时候,就不会调用equals方法了。
{
  if (!(obj instanceof Student))
   throw new RuntimeException("不是学生类型");
  Student s = (Student)obj;
  return this.name.equals(s.name) && this.age == s.age;
  
}

顺序就是这样的,希望能帮到你。
回复 使用道具 举报
车风波 来自手机 中级黑马 2012-6-24 11:27:45
7#
你重写这两个方法然后加上断点debug一下就行了
回复 使用道具 举报
先执行hashCode()后执行equals()。可以用打印语句测试一下。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马