目录

Life in Flow

知不知,尚矣;不知知,病矣。
不知不知,殆矣。

X

HashCode、Equals

HashCode 方法

  • 顶级类 Object ⾥ ⾯的 ⽅法,所有类都是继承 Object 的,返回值 int 类型。
  • 根据 ⼀定的 hash 规则(存储地址,字段,或者 ⻓度等),映射成 ⼀个数值,即散列值。

Equals 方法

  • 顶级类 Object ⾥ ⾯的 ⽅法,所有类都是继承 Object 的,返回值 boolean 类型。
  • 根据 ⾃定义的匹配规则,⽤于匹配两个对象是否 ⼀样, ⼀般逻辑是如下:
    重写规则如下:
 1/**
 2     *  1、判断地址是否⼀样
 3     *  2、⾮空判断和class类型判断
 4     *  3、强转 
 5     *  4、对象里面的字段一一匹配
 6     */
 7    @Override
 8    public boolean equals(Object o) {
 9        //判断地址是否一样
10        if (this == o) {
11            return true;
12        }
13        //⾮空判断和class类型判断
14        if (o == null || getClass() != o.getClass()) {
15            return false;
16        }
17        //强转
18        Student student = (Student) o;
19        //对象里面的字段一一匹配
20        return  age == student.age && name.equals(student.name);
21    }

当向集合中插 ⼊对象时,如何判别在集合中是否已经存在该对象,比如向 Set 中插入对象。

  • 依据 hashCode 和 equals 进行判断,所以 Set 存储的对象必须重写这两个方法。
  • 判断两个对象是否一样,首先判断插入 obj 的 hashcode 值是否存在,如果集合中不存在插入 obj 的 hashcode 值,则还需根据 equals 方法判断对象是否相等。
 1public class Student implements {
 2    private String name;
 3    private int age;
 4
 5    //省略setter、getter方法……  
 6
 7    /**
 8     *  1、判断地址是否⼀样
 9     *  2、⾮空判断和class类型判断
10     *  3、强转
11     *  4、对象里面的字段一一匹配
12     */
13    @Override
14    public boolean equals(Object o) {
15        //判断地址是否一样
16        if (this == o) {
17            return true;
18        }
19        //⾮空判断和class类型判断
20        if (o == null || getClass() != o.getClass()) {
21            return false;
22        }
23        //强转
24        Student student = (Student) o;
25        //对象里面的字段一一匹配
26 	return age == student.age && Objects.equals(name, student.name);
27    }
28
29    /**
30     * 使用Objects工具类的hash()方法,基于对象多个字段生成hashcode
31     * 
32     */
33    @Override
34    public int hashCode() {
35        return Objects.hash(name, age);
36    }
37}

作者:Soulboy