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}