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
    }
    
  • 相关阅读:
    科技小论文
    一线架构—细化架构
    python20.04.10
    软件架构总结
    信息领域热词分析
    架构即未来阅读笔记二
    构架即未来阅读笔记一
    科技小论文之软件质量
    Pre-architecture的需求
    软件质量
  • 原文地址:https://www.cnblogs.com/xyz-1024/p/14263110.html
Copyright © 2011-2022 走看看