重写hashCode或equals

前言

今天突然想到Object的两个方法,equals和hashcode。这两个方法是javase的内容,当初初学java也只是了解过,如今想起来感觉一无所知。

上网搜了搜hashcode和equals的使用场景,搜到了csdn一篇博客,通俗易懂,顺便记录一下自己的学习笔记

博客链接:https://blog.csdn.net/u012557538/article/details/89861552

另一篇博客园的博客链接:https://www.cnblogs.com/keyi/p/7119825.html

par1:hashcode和equals有什么用

hashcode方法可以返回一个对象的哈希值,这和哈希存储有关,哈希值是通过某种函数计算出的对象的存储地址。(不太熟悉的可以看看数据结构的哈希表)

equals方法:比较两个对象的引用地址是否相等,相等返回true,否则返回false

引用于博客园博客的原话

hashCode()方法和equal()方法的作用其实一样,在Java里都是用来对比两个对象是否相等一致,那么equal()既然已经能实现对比的功能了,为什么还要hashCode()呢?

因为重写的equal()里一般比较的比较全面比较复杂,这样效率就比较低,而利用hashCode()进行对比,则只要生成一个hash值进行比较就可以了,效率很高,那么hashCode()既然效率这么高为什么还要equal()呢?

​ 因为hashCode()并不是完全可靠,有时候不同的对象他们生成的hashcode也会一样(生成hash值得公式可能存在的问题),所以hashCode()只能说是大部分时候可靠,并不是绝对可靠,所以我们可以得出:

​ 1.equal()相等的两个对象他们的hashCode()肯定相等,也就是用equal()对比是绝对可靠的。

​ 2.hashCode()相等的两个对象他们的equal()不一定相等,也就是hashCode()不是绝对可靠的。

part2:重写equals的使用场景

一般,我们创建自定义对象,比如创建一个User对象(设只有name,age两个成员),我们判断两个对象是否相等,就是看name和age是否都相等,这时候如果我们不重写equals方法,那么即使name和age都相等,返回值也不是我们想要的true。这时我们就要重写equals方法,把比较引用地址改为比较参数

public class TestEquals {
    public static void main(String[] args) {
        User u1 = new User("yfm", 21);
        User u2 = new User("yfm", 21);
        System.out.println(u1.equals(u2));//false
    }
}
class User{
    private String name;
    private Integer age;
    public User(String name,Integer age){
        this.name=name;
        this.age=age;
    }
}

part3:重写hashcode的使用场景

我们知道,set是无序不重复集合,Map是无序的,且Map的键是不能重复的。

而判断是否重复,使用的就是hashcode方法。

所有这时,若Map的键的类型是自定义对象,我们就要重写该对象的hashcode方法,来保证比较的是内容而不是地址

如何比较:

博客链接:https://blog.csdn.net/u012557538/article/details/89861552

这篇博客写的比较细致,建议观看

posted @ 2021-12-02 09:16  让时间变成力量  阅读(75)  评论(0)    收藏  举报