重写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
}
posted @ 2021-01-11 17:08  小昊子丫  阅读(200)  评论(0编辑  收藏  举报