zoukankan      html  css  js  c++  java
  • 重写equals和hashcode方法

    参考学习

    https://zhuanlan.zhihu.com/p/30321358

    https://blog.csdn.net/javazejian/article/details/51348320

    假如没有重写equals方法,那么equals方法跟==没有区别,都是比较对象的内存地址。

    //Object中的equals方法
    public boolean equals(Object obj) {
        return (this == obj);
    }
    

    如果我们希望看到数据相同时,两个对象就判定为相同,那么就需要重写equals方法。

    举个例子:

    @Override
    public boolean equals(Object obj){
        if(obj instanceof Person){
            Person person=(Person)obj;
            return x==person.x;
        }
        return false;
    }
    

    当然这个例子很简单,不同的类equals都不一样,有时候甚至还要考虑到继承的关系。具体的重写步骤Effective Java中有推荐。

    仅仅是这样重写equals是不够的,我们期望这两个对象是相同的,但是实际上他们的hashcode是不一样的。那么像HashMap、HashSet这样的集合就会认为这是两个不一样的对象,会对他们进行分别存储。

    public static void main(String[] args) {
        Person p1=new Person(1);
        Person p2=new Person(1);
        System.out.println(p1.equals(p2));//true
    
        Map<Person,Integer> map=new HashMap<>();
        map.put(p1,1);
        map.put(p2,1);
        System.out.println(map.size());//2
    }
    

    因此我们还需要重写hashcode方法。

    @Override
    public int hashCode() {
        int res=17;
        res=31*res+x;
        return res;
    }
    

    测试:

    public static void main(String[] args) {
        Person p1=new Person(1);
        Person p2=new Person(1);
        System.out.println(p1.equals(p2));//true
    
        Map<Person,Integer> map=new HashMap<>();
        map.put(p1,1);
        map.put(p2,1);
        System.out.println(map.size());//1
    }
    
  • 相关阅读:
    JAVA 8学习笔记-第五章
    JAVA 8学习笔记-第一章
    JAVA 8学习笔记-第二章
    MySQL应用
    Mac给iTerm2终端配色
    masOS支持NTFS读写,无需第三方软件
    macOS Apache配置用于支持Python CGI编程
    Vim
    Thrift
    Netflix Hystrix
  • 原文地址:https://www.cnblogs.com/xyz-1024/p/14263110.html
Copyright © 2011-2022 走看看