黑马程序员技术交流社区

标题: 关于equals和hashCode方法的问题 [打印本页]

作者: 张锐    时间: 2012-3-8 11:19
标题: 关于equals和hashCode方法的问题
equals和hashCode方法都是object定义的方法。
equals默认和==是一个效果即比较两个对象是不是完全相等而不是内容相等,所以很多子类都要重写equals方法实现自己的判断。api中对equals有这样一句话“注意:当此方法被重写时,通常有必要重写 hashCode 方法,以维护 hashCode 方法的常规协定,该协定声明相等对象必须具有相等的哈希码。

我写了个例子没有重写hashCode也可以实现的要求,大家讨论下是怎么情况?
  1. public class TestHashCode {

  2.         /**
  3.          * @param args
  4.          */
  5.         public static void main(String[] args) {
  6.                 // TODO Auto-generated method stub
  7.                 Dog d1 = new Dog("旺财", 5);
  8.                 Dog d2 = new Dog(new String("旺财"), 5);
  9.                 System.out.println(d1.equals(d2)) ;
  10.                 System.out.println(d1.equals(new Integer(100))) ;
  11.         }

  12. }

  13. class Dog{
  14.         String name;
  15.         int age;
  16.         Dog(String name,int age){
  17.                 this.name = name;
  18.                 this.age = age;
  19.         }
  20.         public boolean equals(Object obj){
  21.                 if(obj instanceof Dog){
  22.                         Dog dog = (Dog)obj;
  23.                         return this.name.equals(dog.name)&&(this.age==dog.age);
  24.                 }
  25.                 return super.equals(obj);
  26.         }
  27.        
  28.         /*public int hashCode() {
  29.                 return new String().hashCode();
  30.                
  31.         }*/
  32. }
复制代码

作者: 李会启    时间: 2012-3-8 12:30
本帖最后由 李会启 于 2012-3-8 12:32 编辑

hashcode是对象在key-value映射集合当中hash函数生成的hash码,可以通过hashcode反算出对象地址,非常适合快速查找。JAVA对象的hashcode是通过对象的地址算出来的整数,不会重复,hashcode方法就是返加这个hashcode的方法,而equals只是比较对象内容是否相等,比如比较对象中所有的属性是否相等。
作者: 马胜平    时间: 2012-3-8 13:05
d1和到d2的hashCode的值不一样,在默认的情况hanshCode方法继承于基类Object的hashCode,而基类的Object的hashCode是根据对象的地址来计算的。如果一个把一个对象put添加到HashMap集合时产生一个hashCode值而取出时是另一个hasnCode值,那么就无法重新取得该对象了。所以这时候必须根据自定义类的某些成员来重写hashCode方法且不能依赖于对象里易变的数据。
作者: a504079589    时间: 2012-3-8 19:33
那两个的hashCode的哈希值不相同当存储自定义对象的时候,如果没有重写hashCode()方法,那么就会调用Object类的hashCode(),得到当前对象的地址,地址不同就不能去重复.
当存储对象的时候,先调用对象的hashCode()方法计算一个哈希值,然后在集合中查找是否有哈希值相同的对象,如果没有哈希值相同的对象,那么直接存入,如果有哈希值相同的对象,调用equals()方法比较,比较结果为true就不存,比较结果为fals则存入,如果希望将属性相同的对象去重复,那么属性相同的对象要返回相同的哈希值.




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