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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 逆世界ylm 中级黑马   /  2014-12-15 10:37  /  1318 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

这两者好像都可以来辨别两个对象是否相等,他们的区别和作用是什么,求大神告知

评分

参与人数 1技术分 +1 收起 理由
杨佳名 + 1 淡定

查看全部评分

7 个回复

倒序浏览
1:equals()相等的两个对象,hashcode()一定相等;
2:equals()不相等的两个对象,却并不能证明他们的hashcode()不相等。
换句话说,equals()方法不相等的两个对象,hashcode()有可能相等。
反过来:
3:hashcode()不等,一定能推出equals()也不等;
4:hashcode()相等,equals()可能相等,也可能不等。

评分

参与人数 1技术分 +1 收起 理由
杨佳名 + 1

查看全部评分

回复 使用道具 举报
1:equals()相等的两个对象,hashcode()一定相等;
2:equals()不相等的两个对象,却并不能证明他们的hashcode()不相等。
换句话说,equals()方法不相等的两个对象,hashcode()有可能相等。
反过来:
3:hashcode()不等,一定能推出equals()也不等;
4:hashcode()相等,equals()可能相等,也可能不等。
另外一般复写hashcode()方法时,都需要复写equals方法
回复 使用道具 举报
这样说吧,equals()在集合框架内其实是根据哈希值来判断是否相等的,哈希值是根据你的对象的某些属性来获取的
回复 使用道具 举报
出了集合框架的话equals 就未必是靠哈希值来判断的了,哈希值是地址值和你存储的元素的内容通过某种算法组合出来的一种值,很有可能储存在A内存的数值X 和储存在B内存的数值y 是同一个哈希值,比如你比较一个字符串用equals 比较肯定不一样的X 和 Y 但是也许哈希值一样。
equals 比较的字符串是比较他们的真实值 而不是哈希值。
在哈希集合框架内equals 就靠的是比较哈希值来判断是否是一个元素了。所以为了让你的哈希表也许在同一个哈希值下有两个不同的元素。
需求:去除hashset 中的具有相同值的Person类
  1.     package SetShow;  
  2.     import java.util.HashSet;  
  3.     import java.util.Iterator;  
  4.     public class HashSetDemo {  
  5.       
  6.         public static void main(String[] args) {  
  7.                   
  8.             HashSet hs = new HashSet();  
  9.             hs.add(new Person("a1",11));  
  10.               
  11.             hs.add(new Person("a2",12));  
  12.             hs.add(new Person("a2",12));  
  13.                      
  14.                     hs.add(new Person("a3",13));  
  15.             
  16.             Iterator it = hs.iterator();  
  17.             while(it.hasNext())  
  18.             {  
  19.                 Person p = (Person) it.next();  
  20.                 sop(p.getName()+" : "+p.getAge());  
  21.             }  
  22.         }  
  23.         public static void sop(Object obj)  
  24.         {  
  25.                 System.out.print(obj);  
  26.                 System.out.println();  
  27.             }  
  28.     }  
  29.     class Person  
  30.     {  
  31.         private String name;  
  32.         private int age;  
  33.         Person(String name, int age)  
  34.         {  
  35.             this.name = name;  
  36.             this.age = age;  
  37.         }  
  38.         public int hashCode()//按照条件而设定哈希值  
  39.         {  
  40.             System.out.println(this.name+" hash code "+name.hashCode()+age);  
  41.             return name.hashCode()+age*27;  
  42.         }  
  43.         public String getName()  
  44.         {  
  45.             return name;  
  46.         }  
  47.         public int getAge()  
  48.         {  
  49.             return age;  
  50.         }  
  51.          
  52.         public boolean equals(Object obj)  
  53.         {  
  54.             if(!(obj instanceof Person))// obj instanceof person:在这里说,obj 是 Person吗  
  55.                 return false;  
  56.             Person p = (Person) obj;  
  57.                     System.out.println(this.name+"...equals ?..."+p.name);  
  58.             return this.name.equals(p.name)&& this.age == p.age;  
  59.         }//this equals 在运行contains 的时候被自动调用了,所以如果想比较其他的元素的内容可以自己编写一遍  
  60.     }     
复制代码


输出结果:

a1 hash code 305611
a2 hash code 305712
a2 hash code 305712
a2...equals ?...a2
a3 hash code 305813
a1 : 11
a2 : 12
a3 : 13


从上边的例子可以看出,equals 方法在使用前是调用的hashcode()方法的,名字和年龄经过哈希算法过后就变成了不同的数值,当第二个a2进入哈希表的时候发现他的哈希值名字和以前的那个a2 一样,所以就调了equals 方法进行比较,比较两个person 的name 和 age,具体的操作是:(第二个a2) .equals(第一个a2)。如果发现哈希值一样,内容也一样就判定指向的是同一个对象,则不会把同一个对象存入哈希表两次。所以后来就自动出现了只存入a1,a2,a3的三个情况。

和list 一样hashset 的remove 和 conatins 方法也是依赖equals方法,equals 依靠的是hashcode。
回复 使用道具 举报
你在集合框架内覆写了equals 方法,这个覆写的方法是依赖哈希值的,而在覆写的equals 方法内,你有调用了一个equals 方法,第二个equals方法是比较的真实值是String 自己的比较方法。
String 自己也是一个类,Sun 公司的程序员保证了这个类的equals 方法肯定能比较出真实值,但是是否使用了哈希值比较就不得而知了目前。

评分

参与人数 1技术分 +2 收起 理由
杨佳名 + 2

查看全部评分

回复 使用道具 举报
如果还不懂我也没招了 去请叫大神们吧
回复 使用道具 举报
wangcongwu 发表于 2014-12-17 00:43
如果还不懂我也没招了 去请叫大神们吧

懂了,谢谢大神
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马