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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 胡遇潮 黑马帝   /  2011-12-18 18:55  /  2992 人查看  /  9 人回复  /   1 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 胡遇潮 于 2011-12-19 11:51 编辑

hashCode()和equals()一直没搞明白。这两个到底有什么作用。

评分

参与人数 1技术分 +1 收起 理由
吴上储 + 1

查看全部评分

9 个回复

倒序浏览
徐杨 黑马帝 2011-12-18 20:12:10
沙发
是这样的  hashCode()和equals()在构建类的时候  都是保证元素唯一性的条件,首先比较hashcode()  这个使用的是hashcode算法算出一个值然后与已存在在集合中的对比,如果一样就判断一样,这时候如果不一样再去判断equals,如果equals中的条件再一样的话 则判断两个为同一个元素,如果不一样的话判断两个元素不一样。 可以看一下集合的视频我记得那里有专门讲解

评分

参与人数 1技术分 +1 收起 理由
吴上储 + 1

查看全部评分

回复 使用道具 举报
刘健 黑马帝 2011-12-18 20:22:21
藤椅
hashCode()一般多用于集合元素的唯一性判断,而equals()多用于String等类型的字符串的内容的比较。
而且在java中,两个对象相同,那他们的hashCode一定相同,但是hashCode相同,对象不一定相同,这里说的对象相同是指equals判断相同
回复 使用道具 举报
曾运 黑马帝 2011-12-19 00:32:34
板凳
Object 方法中有 toString(),【返回该对象的字符串表示】hashCode()【返回该对象的哈希码值。】 equals(Object obj)
【指示其他某个对象是否与此对象“相等”(对象内容的比较)】方法,一般我们自定义一个类的时候要重写这三个方法
如我们定义了一个Person类
  1. class Person
  2. {
  3.         String name;
  4.         int age;
  5.         Person(String name,int age)
  6.         {
  7.                 this.name=name;
  8.                 this.age=age;
  9.         }




  10.         public int hashCode()
  11.         {
  12.                 return name.hashCode()+age*13;
  13.         }

  14.         public boolean equals(Object obj)
  15.         {   
  16.                 if(this==obj)
  17.                 {
  18.                         return true;
  19.                 }
  20.         if(!(obj instanceof Person))
  21.                 {
  22.                         return false;
  23.                 }
  24.         Person p=(Person)obj;
  25.                
  26.                 if(p.name.equals(this.name)&&p.age==this.age)
  27.                 {
  28.                         return true;
  29.                 }
  30.                 else
  31.                 {
  32.                         return false;
  33.                 }
  34.         }
  35.   public String toString()
  36. {
  37. return "姓名:"+this.name+" 年龄:"+this.age;
  38. }
  39. }
复制代码
判断两个对象是否相等,先调用hashCode()方法,如果哈希值一样,则调用equals方法进行内容比较判断两个对象是否相同,
如果哈希值不一样,则不再调用equals方法进行比较。

评分

参与人数 1技术分 +2 收起 理由
王德云 + 2

查看全部评分

回复 使用道具 举报
在hashset中,对于判断元素是否存在,以及删除等此操作,依赖的元素是hashcode,一般都要复写
hashcode()和equals,在ArrayList中只依赖于equals,hashcode()和equals是自动运行的,刚开始学的时候看到复写完也没调用,以为白写了呢,呵呵。

评分

参与人数 1技术分 +1 收起 理由
王德云 + 1

查看全部评分

回复 使用道具 举报
刘旭 黑马帝 2011-12-19 11:06:36
地板
hashcode()方法内部采用的是哈希算法。当调用hashcode()方法时,返回的是对象的hash值,这个hash值于与内存中的一个地址形成映射关系。因此,当调用hashcode()方法知道对象的hash值后,就可以快速的在内存中找到这个对象。hash算法是一种查找效率很高的算法。所以,在Object类中定义了hashcode()方法。当Object类的子类某些功能需要频繁查找操作时,就可以用这个方法提高效率。例如:hashset中频繁比较操作,比较时用基于hash算法的hashcode()方法就可以快速找到要比较的对象。所以,hashcode()方法只是返回的一个虚拟的地址值。他在hashset的应用就是基于地址判断两个对象是否相等。equals()方法也是判断两个对象是否相等的。但是,一班自定义类时,重写equals()时,是基于自定义类特有属性判断对象是否相等。
例如:有两个Person雷对象p1和p2.当调用对象的equals()方法判断时,判断的是p1和p2的名字、年龄等是否相等。当调用对象的hashcode(),分别返回的是他们的hash值。在hashset,比较他们的hash值是否相等,即他们是否存放在同一个内存地址。

评分

参与人数 1技术分 +1 收起 理由
王德云 + 1

查看全部评分

回复 使用道具 举报
刘基军 黑马帝 2011-12-19 11:18:30
7#
本帖最后由 monghuan 于 2011-12-20 15:56 编辑

1.以集合为例,对于HashSet集合,元素不可以重复;对于HashMap集合,其中键是唯一的(即不可重复)。针对这种不可重复,是如何实现的呢?
实际上就是,在元素或键中进行hashCode()和equals()方法的重写。
举例:当重写了Student类的hashCode()和equals()后,
  1. class Student
  2. {
  3.         String name;
  4.         int age;
  5.         Student(String name,int age)
  6.         {
  7.                 this.name=name;
  8.                 this.age=age;       
  9.         }       
  10.         public int hashCode()
  11.         {
  12.                 return name.hashCode()+age;       
  13.         }
  14.         public boolean equals(Object obj)
  15.         {
  16.                 if(!(obj instanceof Student))
  17.                         return false;
  18.                 Student objS = (Student)obj;
  19.                 return this.name.equals(objS.name)&&(this.age==objS.age);       
  20.         }
  21.         public String toString()  //toString()方法一般也会重写,可以重新定义格式
  22.         {
  23.                 return name+"-"+age;       
  24.         }
  25. }
复制代码
执行main()中:
  1. HashSet<Student> hs =new HashSet<Student>(); //创建了一个HashSet集合对象,
  2.           hs.add(new Student("Jack",20)); //像集合对象添加元素,第一个元素添加时肯定不会重复
  3.           hs.add(new Student("Jack",21)); //进行第二个元素的添加,这时就会进行元素是否重复的判断,首先计算new Student("Jack",21))对象的hashCode(就是hashCode()方法的返回值),若发现与集合中已存在的元素的hashCode不相同,就直接判断为new Student("Jack",21))这个元素不是重复的,可以添加进集合中;反之,若发现与集合中已存在的元素的hashCode相同,就接着进行equals()方法的判断,根据equals()中的比较细节进行比较(方法的返回值为true,表示元素重复;反之,表示元素不重复),(例子中)比较后发现返回值为false,此时才说明new Student("Jack",21))这个元素不是重复的,存储进集合。
  4. //hashCode()和equals()的这些比较都是JVM内部进行的

  5.           System.out.println(hs); //打印输出结果:[Jack-21, Jack-20]
  6.   
复制代码
2.在集合中,使用到带有“Hash”关键字的类,一般就需要重写“hashCode()”和“equals()”方法了。

评分

参与人数 1技术分 +1 收起 理由
吴上储 + 1

查看全部评分

回复 使用道具 举报
monghuan解释也还行,从中又巩固了一下这个知识,就是讲main()中,有点小错误,改正一下,计算new Student("Jack",21)对象的hashCode,若发现与HashSet集合已存在的元素的hashCode相同,这时再去调用equals()方法判断,根据equals()进行更细节的比较(也就是比较当前的对象和HashSet中的对象的内容是否一样,),如果equals()返回ture,则说明元素重复,否则元素不同,可以add();   
当haseCode()不相同,就直接判断两对象不同,可以add()到HashSet中。

评分

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

查看全部评分

回复 使用道具 举报
刘基军 黑马帝 2011-12-20 15:59:12
9#
为梦而战 发表于 2011-12-20 13:48
monghuan解释也还行,从中又巩固了一下这个知识,就是讲main()中,有点小错误,改正一下,计算new Student( ...

谢谢指正,刚看到
回复 使用道具 举报
monghuan 发表于 2011-12-20 15:59
谢谢指正,刚看到

:handshake互相学习共同促进!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马