黑马程序员技术交流社区

标题: 重写hashCode()方法的疑问 [打印本页]

作者: 胡志翔    时间: 2013-11-1 12:30
标题: 重写hashCode()方法的疑问
  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()就可以说明问题了。
作者: ~﹏~    时间: 2013-11-1 12:40
因为hashCode方法是根据一定的算法实现的,所以会存在两个不相同的对象算出的hashCode是相同的!

在java的集合中,判断两个对象是否相等的规则是:
1),判断两个对象的hashCode是否相等
      如果不相等,认为两个对象也不相等,完毕
      如果相等,转入2)
(这一点只是为了提高存储效率而要求的,其实理论上没有也可以,但如果没有,实际使用时效率会大大降低,所以我们这里将其做为必需的。后面会重点讲到这个问题。)
2),判断两个对象用equals运算是否相等
      如果不相等,认为两个对象也不相等
      如果相等,认为两个对象相等(equals()是判断两个对象是否相等的关键)
作者: 零下五度的水    时间: 2013-11-1 13:06
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程序员来说,这基本等同于神谕,
为什么类名开头要大写呢,为什么方法名开头要小写呢,一个道理嘛
作者: 零下五度的水    时间: 2013-11-1 13:11
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必须是相等的
作者: 卑微の小幸福    时间: 2013-11-1 21:53
如果不重写equals,那么比较的将是对象的引用是否指向同一块内存地址,重写之后目的是为了比较两个对象的value值是否相等。特别指出利用equals比较八大包装对象
(如int,float等)和String类(因为该类已重写了equals和hashcode方法)对象时,默认比较的是值,在比较其它自定义对象时都是比较的引用地址





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2