• 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;// 地址
    }
  • 相关阅读:
    LeetCode 404. 左叶子之和
    三年了
    LeetCode 543. 二叉树的直径
    求结点在二叉排序树中层次的算法
    LeetCode 98. 验证二叉搜索树
    LeetCode 236. 二叉树的最近公共祖先
    LeetCode 129. 求根到叶子节点数字之和
    LeetCode 113. 路径总和 II
    LeetCode 107. 二叉树的层次遍历 II
    LeetCode 144. 二叉树的前序遍历 (非递归)
  • 原文地址:https://www.cnblogs.com/cyh1282656849/p/14377254.html
Copyright © 2020-2023  润新知