码迷,mamicode.com
首页 > 编程语言 > 详细

java为什么要重写hashCode方法和equals方法?

时间:2015-09-10 01:52:33      阅读:241      评论:0      收藏:0      [点我收藏+]

标签:

  之前发布过一篇文章说的是关于 equals方法重写 http://www.cnblogs.com/aL0n4k/p/4777333.html

 下面就hashCode方法发表一下本人的理解,仅供参考,交流.

 在 关于java重写equals方法 已经提及说,比较2个对象的时候,要比较他们各自的属性.

 那么重写hashCode方法是因为我们在接触到集合的时候,里面有个Set接口,他只能添加无序以及不重复的对象元素.

 那有人会问,既然是这样我们直接用equals判断不就完了么?

 实际上对Set集合而言,他是需要先比较对象的hashCode值的,也就是一个对象的引用地址(在内存中的存储地址)

 Set是先调用hashCode判断地址值是否一样,如果不一样则直接插入,一样则再调用equals方法判断内容是否相同,如果还相同再不插入,不相同则插入.

 

 

 重写hashCode方法就是为了和已经插入的那些元素进行具体的元素比较(这里就是故意要两个对象引用值相同,就是为了去判断2个对象属性是否一样)

 1.两个对象的地址值不一样时:那么即使他们的属性是一样的内容,也不去用equals判断,直接不插入到集合中.

 2.两个对象地址值比较相同时:再去用equals比较,然后equals比较完了还是一样的话,就不插入.不一样就插入.

 

   小结:

 所以说我们要想在2个对象(内存值不一样),但是属性内容是一样 只插入其中一个的情况下可以重写hashCode方法

 重写hashCode方法就是为了让equals这个方法再去比较一下对象的属性是不是一样的,因为jdk(本人的1.8)默认提供的hashCode方法只是简单的返回2个

 对象的码值,又因为我们是通过new创建的对象引用,那么肯定是不一样的地址了,所以我们就需要重写让他2个对象都返回一样的地址值.然后判断equals方法比较具体的

 属性之后,再去决定要不要插入这个元素.

 当然更快就是为了加快插入时的检索,因为后面还需要调用equals方法进行判断.如果直接通过hashCode判断出他们地址值相等,那么就不需要去判断equals方法了.

   Set插入时具体操作可以看http://blog.csdn.net/liushuai_ly/article/details/8197508

 1 import java.util.HashSet;
 2 import java.util.Set;
 3 
 4 public class Test_Set {
 5 
 6     public static void main(String[] args) {
 7         Person p1 = new Person("小明", 11);
 8         //假设p1是你
 9         Person p2 = new Person("小明", 11);
10         //假设p2是你同学,他也叫小明,然后他跟你年龄一样大都是11岁.
11         //那这时候我们就认定他是同一个人么?
12         
13         //这是2个人没错吧?(但是相对于没有重写的hashCode他们就是2个人,可是我们这时候只需要插入一个对象,因为他们是相同的属性)
14         //那么我们就需要重写hashCode方法和Equals方法
15         //p1和p2都是通过new创建的对象引用,他们的内存值(hashCode码值)是不一样的
16         //所以即使他们的对象属性(age)都一样,也会认为他们是2个人.
17         //那么这时候我们就需要重写hashCode方法,让两个对象返回的hashCode码值都是一样的.
18         //这时候我们才去用equals方法比较他们之间各个属性,如果比较完了还是一样的.
19         //那么就表示他们是一个对象,那么我们就不往Set集合中插入后面的那个元素.
20         //如果不一样,我们就插入p2这个对象.
21         //但如果你说我没必要这样子,我就要把所有属性都一样的2个对象插到集合里面,那么你可以不重写这些东西.
22         //不重写的话,他们比较hashCode值的时候总是不同的2个对象(即使他们所有的属性都完全相同)
23         
24         Set<Person> set = new HashSet<Person>();
25         set.add(p1);
26         set.add(p2);
27         //输出一下set所有的元素,看看能不能输出两个对象出来
28         System.out.println(set);
29         //本人机器输出结果为 [Person@b90f5]
30 
31     }
32     
33 }
34 class Person {
35     String name;
36     int age;
37     
38     
39     public Person(String name, int age) {
40         this.name = name;
41         this.age = age;
42     }
43     
44 
45     /*    @Override //重写hashCode
46     public int hashCode() {
47         return age + name.hashCode();
48         //返回一个固定的值,如果一样就说明地址值一样,再去equals()判断,不一样,就直接插入.
49     }*/
50     
51     
52     
53     @Override 
54     //Eclipse自动生成的hashCode重写
55     public int hashCode() {
56         final int prime = 31;
57         int result = 1;
58         result = prime * result + age;
59         result = prime * result + ((name == null) ? 0 : name.hashCode());
60         return result;
61     }
62 
63 
64     @Override
65     public boolean equals(Object obj) {
66         if (this == obj)
67             return true;
68         if (obj == null)
69             return false;
70         if (getClass() != obj.getClass())
71             return false;
72         Person other = (Person) obj;
73         if (age != other.age)
74             return false;
75         if (name == null) {
76             if (other.name != null)
77                 return false;
78         } else if (!name.equals(other.name))
79             return false;
80         return true;
81     }
82     
83 
84 }

 

java为什么要重写hashCode方法和equals方法?

标签:

原文地址:http://www.cnblogs.com/aL0n4k/p/4796436.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!