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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 胡志翔 中级黑马   /  2013-11-1 12:30  /  771 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  1. class Cat
  2. {
  3.         private String name;
  4.         private int age;
  5.         private double weight;
  6.         private Color color;
  7.         public Cat(String name , int age , double weight , Color color){
  8.              this.name = name;
  9.              this.age = age;
  10.              this.weight = weight;
  11.              this.color = color;
  12.         }
  13.         public boolean equals(Object obj){
  14.             if(this == obj){
  15.                      return true;
  16.                  }
  17.                  if (obj == null)
  18.                  {
  19.                          return false;
  20.                  }
  21.                  if(this.getClass() != obj.getClass()){
  22.                     return false;
  23.                  }
  24.                  Cat cat = (Cat)obj;
  25.                  return name.equals(cat.name)&&(age == cat.age)&&(weight == cat.weight)&&(color.equals(cat.color));
  26.         }
  27.         public int hashCode(){
  28.              return 7 * name.hashCode() + 11* new Integer(age).hashCode() + 13 * new Double(weight).hashCode() + 17 * color.hashCode();
  29.         }
  30. }
复制代码
为什么比较对象是否相等要重写hashCode()方法呢,明明有重写equals()就可以说明问题了。

4 个回复

倒序浏览
因为hashCode方法是根据一定的算法实现的,所以会存在两个不相同的对象算出的hashCode是相同的!

在java的集合中,判断两个对象是否相等的规则是:
1),判断两个对象的hashCode是否相等
      如果不相等,认为两个对象也不相等,完毕
      如果相等,转入2)
(这一点只是为了提高存储效率而要求的,其实理论上没有也可以,但如果没有,实际使用时效率会大大降低,所以我们这里将其做为必需的。后面会重点讲到这个问题。)
2),判断两个对象用equals运算是否相等
      如果不相等,认为两个对象也不相等
      如果相等,认为两个对象相等(equals()是判断两个对象是否相等的关键)

评分

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

查看全部评分

回复 使用道具 举报
Note that it is generally necessary to override the hashCode method whenever this method is overridden, so as to maintain the general contract for the hashCode method, which states that equal objects must have equal hash codes.
为了遵循约定,而且这个约定是SUN公司设置的,对于Java程序员来说,这基本等同于神谕,
为什么类名开头要大写呢,为什么方法名开头要小写呢,一个道理嘛

评分

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

查看全部评分

回复 使用道具 举报
If two objects are equal according to the equals(Object)
method, then calling the hashCode method on each of
the two objects must produce the same integer result.
其实,equals是用不到Hashcode的,上面这是约定的第二条,
不是说如果两个对象相等就调用hashCode方法比较,
而是说如果两个对象相等,我们约定它们的hashcode必须是相等的
回复 使用道具 举报
如果不重写equals,那么比较的将是对象的引用是否指向同一块内存地址,重写之后目的是为了比较两个对象的value值是否相等。特别指出利用equals比较八大包装对象
(如int,float等)和String类(因为该类已重写了equals和hashcode方法)对象时,默认比较的是值,在比较其它自定义对象时都是比较的引用地址

评分

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

查看全部评分

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