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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 张锐 中级黑马   /  2012-3-8 11:19  /  1861 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

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. }
复制代码

评分

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

查看全部评分

3 个回复

倒序浏览
本帖最后由 李会启 于 2012-3-8 12:32 编辑

hashcode是对象在key-value映射集合当中hash函数生成的hash码,可以通过hashcode反算出对象地址,非常适合快速查找。JAVA对象的hashcode是通过对象的地址算出来的整数,不会重复,hashcode方法就是返加这个hashcode的方法,而equals只是比较对象内容是否相等,比如比较对象中所有的属性是否相等。

评分

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

查看全部评分

回复 使用道具 举报
d1和到d2的hashCode的值不一样,在默认的情况hanshCode方法继承于基类Object的hashCode,而基类的Object的hashCode是根据对象的地址来计算的。如果一个把一个对象put添加到HashMap集合时产生一个hashCode值而取出时是另一个hasnCode值,那么就无法重新取得该对象了。所以这时候必须根据自定义类的某些成员来重写hashCode方法且不能依赖于对象里易变的数据。

评分

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

查看全部评分

回复 使用道具 举报
那两个的hashCode的哈希值不相同当存储自定义对象的时候,如果没有重写hashCode()方法,那么就会调用Object类的hashCode(),得到当前对象的地址,地址不同就不能去重复.
当存储对象的时候,先调用对象的hashCode()方法计算一个哈希值,然后在集合中查找是否有哈希值相同的对象,如果没有哈希值相同的对象,那么直接存入,如果有哈希值相同的对象,调用equals()方法比较,比较结果为true就不存,比较结果为fals则存入,如果希望将属性相同的对象去重复,那么属性相同的对象要返回相同的哈希值.

评分

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

查看全部评分

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