zoukankan      html  css  js  c++  java
  • 关于重写equals()与hashCode()

    在HashMap与HashSet中,是不允许元素重复的。

    在判定时比较元素的hashCode()是否相等,equals()是否返回true,那么问题来了

    这是一个Person类

    public class Person {
        private String id;
        private String name;
        private Integer age;
        public String getId() {
            return id;
        }
        public void setId(String id) {
            this.id = id;
        }
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        public Integer getAge() {
            return age;
        }
        public void setAge(Integer age) {
            this.age = age;
        }
        @Override
        public String toString() {
            return "Person [id=" + id + ", name=" + name + ", age=" + age + "]";
        }
        @Override
        public int hashCode() {
            final int prime = 31;
            int result = 1;
            result = prime * result + ((age == null) ? 0 : age.hashCode());
            result = prime * result + ((id == null) ? 0 : id.hashCode());
            result = prime * result + ((name == null) ? 0 : name.hashCode());
            return result;
        }
        @Override
        public boolean equals(Object obj) {
            if (this == obj)
                return true;
            if (obj == null)
                return false;
            if (getClass() != obj.getClass())
                return false;
            Person other = (Person) obj;
            if (age == null) {
                if (other.age != null)
                    return false;
            } else if (!age.equals(other.age))
                return false;
            if (id == null) {
                if (other.id != null)
                    return false;
            } else if (!id.equals(other.id))
                return false;
            if (name == null) {
                if (other.name != null)
                    return false;
            } else if (!name.equals(other.name))
                return false;
            return true;
        }
        /*@Override
        public int hashCode() {
            System.out.println("id = " + id + ";id.hashCode = " + id.hashCode());
            return id.hashCode();
        }
        @Override
        public boolean equals(Object obj) {
            System.out.println("equals");
            Person p = (Person)obj;
            if(this.id == p.id) {
                return true;
            }else{
                return false;
            }
        }*/
    }

    这是一个Test类

    public class TestHashCode {
        public static void main(String[] args) {
            Set<Person> set = new HashSet<Person>();
            Person p1 = new Person();
            p1.setId("11");
            p1.setName("张三");
            p1.setAge(20);
            Person p2 = new Person();
            p2.setId("11");
            p2.setName("李四");
            p2.setAge(30);
            set.add(p1);
            set.add(p2);
            System.out.println(p1.hashCode() == p2.hashCode());
            System.out.println(p1.equals(p2));
            for (Person person : set) {
                System.out.println(person.toString());
            }
        }
    }

    如果Person的id属性作为主键,且只重写equals方法,我们认为id相等的两个对象为同一个对象

    此时p1.equals(p2)返回true,但是hashCode()却不相等,而hashSet判断唯一的依据是hashCode()值相等且equals()返回true

    所以我们的预期是p1和p2为同一个对象,但是hashSet认为他们是两个对象。

    所以我们需要同时重写hashCode()和equals()方法。

  • 相关阅读:
    立个铁矿石的flag,从7月初开始,铁矿石的库存,可能要进入累库存阶段了.
    让你的 vs code 跑在云上,用手机浏览器就能写代码
    ASP.NET Core 2 High Performance 目录和读书笔记
    [转帖]无网络离线安装 vs2017
    centos下 .net core 2.0 升级 到 2.1 遇到的一个小问题
    .net core jwt 入门记录
    GTX 750TI 使用 ffmpeg 时无法用 GPU HEVC(h.265) 进行加速
    [翻译] 编写高性能 .NET 代码--第二章 GC -- 减少大对象堆的碎片,在某些情况下强制执行完整GC,按需压缩大对象堆,在GC前收到消息通知,使用弱引用缓存对象
    [翻译] 编写高性能 .NET 代码--第二章 GC -- 将长生命周期对象和大对象池化
    [翻译] 编写高性能 .NET 代码--第二章 GC -- 避免使用终结器,避免大对象,避免复制缓冲区
  • 原文地址:https://www.cnblogs.com/cz305679760/p/4560137.html
Copyright © 2011-2022 走看看