java 重写hashcode和equals

  • Object源码

public class Object {
   //native表明该方法是否操作系统实现,java调用操作系统底层代码获取哈希值
  public native int hashCode();
  //直接比较地址
  public boolean equals(Object obj) { return (this == obj); }
}
  • 重写场景

    需要重写equals()的场景:对引用类型使用equals比较时
    需要重写hashcode()的场景:hasMap集合key为对象时(hasMap底层使用key的hascode判断是否相同若key是引用类型这时需要重写对象的hashcode)

  • 重写示例一

package indi.cyh.entity;

/**
 * @ClassName Student
 * @Description TODO
 * @Author cyh
 * @Date 2021/2/5 0005 11:22
 */
public class Student {
    private String name;// 姓名
    private String sex;// 性别
    private String age;// 年龄
    private float weight;// 体重
    private String addr;// 地址

    // 重写hashcode方法
    @Override
    public int hashCode() {
        int result = name.hashCode();
        result = 17 * result + sex.hashCode();
        result = 17 * result + age.hashCode();
        return result;
    }

    // 重写equals方法
    @Override
    public boolean equals(Object obj) {
        if(!(obj instanceof Student)) {
            // instanceof 已经处理了obj = null的情况
            return false;
        }
        Student stuObj = (Student) obj;
        // 地址相等
        if (this == stuObj) {
            return true;
        }
        // 如果两个对象姓名、年龄、性别相等,我们认为两个对象相等
        if (stuObj.name.equals(this.name) && stuObj.sex.equals(this.sex) && stuObj.age.equals(this.age)) {
            return true;
        } else {
            return false;
        }
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public String getAge() {
        return age;
    }

    public void setAge(String age) {
        this.age = age;
    }

    public float getWeight() {
        return weight;
    }

    public void setWeight(float weight) {
        this.weight = weight;
    }

    public String getAddr() {
        return addr;
    }

    public void setAddr(String addr) {
        this.addr = addr;
    }
}
  • 重写示例二

//利用lombok项目提供的注解功能  等效于示例一
@Data
@EqualsAndHashCode(exclude = {"name","sex","age"})
public class Student {
private String name;// 姓名
private String sex;// 性别
private String age;// 年龄
private float weight;// 体重
private String addr;// 地址
}
原文地址:https://www.cnblogs.com/cyh1282656849/p/14377254.html