目录

Life in Flow

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

X

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);
    }
}

作者:Soulboy