HashCode、Equals
HashCode 方法
- 顶级类 Object⾥ ⾯的 ⽅法,所有类都是继承 Object 的,返回值 int 类型。
- 根据 ⼀定的 hash 规则(存储地址,字段,或者 ⻓度等),映射成 ⼀个数值,即散列值。
Equals 方法
- 顶级类 Object⾥ ⾯的 ⽅法,所有类都是继承 Object 的,返回值 boolean 类型。
- 根据 ⾃定义的匹配规则,⽤于匹配两个对象是否 ⼀样, ⼀般逻辑是如下:
重写规则如下:
/**
* 1、判断地址是否⼀样
* 2、⾮空判断和class类型判断
* 3、强转
* 4、对象里面的字段一一匹配
*/
@Override
public boolean equals(Object o) {
//判断地址是否一样
if (this == o) {
return true;
}
//⾮空判断和class类型判断
if (o == null || getClass() != o.getClass()) {
return false;
}
//强转
Student student = (Student) o;
//对象里面的字段一一匹配
return age == student.age && name.equals(student.name);
}
当向集合中插 ⼊对象时,如何判别在集合中是否已经存在该对象,比如向 Set 中插入对象。
- 依据 hashCode 和 equals 进行判断,所以 Set 存储的对象必须重写这两个方法。
- 判断两个对象是否一样,首先判断插入 obj 的 hashcode 值是否存在,如果集合中不存在插入 obj 的 hashcode 值,则还需根据 equals 方法判断对象是否相等。
public class Student implements {
private String name;
private int age;
//省略setter、getter方法……
/**
* 1、判断地址是否⼀样
* 2、⾮空判断和class类型判断
* 3、强转
* 4、对象里面的字段一一匹配
*/
@Override
public boolean equals(Object o) {
//判断地址是否一样
if (this == o) {
return true;
}
//⾮空判断和class类型判断
if (o == null || getClass() != o.getClass()) {
return false;
}
//强转
Student student = (Student) o;
//对象里面的字段一一匹配
return age == student.age && Objects.equals(name, student.name);
}
/**
* 使用Objects工具类的hash()方法,基于对象多个字段生成hashcode
*
*/
@Override
public int hashCode() {
return Objects.hash(name, age);
}
}