hashCode 和 equals 的区别

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 }
hmoban主题是根据ripro二开的主题,极致后台体验,无插件,集成会员系统
自学咖网 » hashCode 和 equals 的区别