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
    }
    
  • 相关阅读:
    找零问题-完全背包
    可同时在nodejs和浏览器端使用的websocket
    C++ vector 比较大小
    npm ERR! Unexpected token in JSON at position 0 while parsing near '<HTML> 解决办法
    C/C++宏定义中#与##区别
    解析日志工具。
    3
    2
    dssfsfsfs
    android获取USB设备的名称
  • 原文地址:https://www.cnblogs.com/xyz-1024/p/14263110.html
Copyright © 2011-2022 走看看