hashCode 和 equals 的区别

今天记录一下hashCode的知识,以前都没有怎么接触过的,感觉还是很陌生,专门去学习了一下

 首先我最大的问题就是hashCode究竟是干什么 的,现在也一知半解了吧,

哈希值是一个对象的地址值,是一个逻辑地址,是模拟出来得到地址,不是数据实际存储的物理地址。而hashCode()就是寻找哈希值的一个方法

那又要为什么要有这个hashCode() 呢?

  为了减少equals()的使用次数,提高执行效率(说的比较不全面,但自己能理解就好,下面通过具体讲解就通了)

 

hashCode() 和 equals()方法的作用(分为两种情况)

1、如果类中不重写他们:

hashCode():返回对象的地址值

equals(): 比较两个值的地址

 2、如果类中重写了:

hashCode(): 根据对象的成员变量,返回一个整数

equals():比较两个值是否相等

 

 hashCode 和 equals 重写后比较两个对象是否相等

如果两个对象比较的equals()相等,那么这两个对象的hashCode()肯定相等,就是说equals()是绝对靠谱的

如果两个对象比较的hashCode()相等,那么equals()去做比较却不一定相等,就是说hashCode()不是绝对可靠的

 

 通过hashCode()和 equals()搭配是如何提高效率的

对于一个对象中有大量的成员信息,只用equals()比较效率会比较低

可以先通过hashCode() 比较,如果不相等,则两个对象一定不同,如果相等,那就用equals()进行比较,这样hashCode()方法可以给我们比较出大部分对象的比较,从而提高效率

 

最后讲讲他们两个搭配的应用

HashSet集合都知道吧,它的特点就是无序,元素唯一,主要靠的就是重写hashCode()和equals()方法:

下面用代码演示:

 1 //建立JavaBean
 2 import java.util.Objects;
 3 
 4 public class HashSetTest {
 5     private String name;
 6     private int age;
 7     public String getName() {
 8         return name;
 9     }
10     public void setName(String name) {
11         this.name = name;
12     }
13     public int getAge() {
14         return age;
15     }
16     public void setAge(int age) {
17         this.age = age;
18     }
19     public HashSetTest(String name, int age) {
20         this.name = name;
21         this.age = age;
22     }
23     @Override
24     public String toString() {
25         return "HashSetTest{" +
26                 "name='" + name + '\'' +
27                 ", age=" + age +
28                 '}';
29     }
30     public HashSetTest() {
31     }
32 //   重写equals()和hashCode()方法
33     @Override
34     public boolean equals(Object o) {
35         if (this == o) return true;
36         if (o == null || getClass() != o.getClass()) return false;
37         HashSetTest that = (HashSetTest) o;
38         return age == that.age &&
39                 Objects.equals(name, that.name);
40     }
41     @Override
42     public int hashCode() {
43         return Objects.hash(name, age);
44     }
45 }

 

 测试代码:

 1 import java.util.HashSet;
 2 import java.util.Iterator;
 3 
 4 public class HashSetTest1 {
 5     public static void main(String[] args) {
 6         HashSetTest hashSetTest = new HashSetTest("张三",12);
 7         HashSetTest hashSetTest1 = new HashSetTest("李四",34);
 8         HashSetTest hashSetTest2 =new HashSetTest("张三",12);//定义一个前面出现过的对象,那么后面就不会加入到hashSet集合中
 9         HashSet<HashSetTest> hashSet = new HashSet<>();
10         //添加对象到hashSet集合中,此时就会调用hashCode和equals方法
11         hashSet.add(hashSetTest);
12         hashSet.add(hashSetTest1);
13         hashSet.add(hashSetTest2);
14         //遍历hashSet集合
15         Iterator iterator =hashSet.iterator();
16         while (iterator.hasNext()){
17             System.out.println(iterator.next());
18         }
19     }
20 }

 

输出结果:

hashCode 和 equals 的区别

 

 谢谢大家,今天就讲到这里了,如有错误望及时提出来哦

 

上一篇:myFirstBlog


下一篇:Lambok中的@EqualsAndHashCode