其他分享
首页 > 其他分享> > 为什么重写equals方法时必须重写hashcode方法

为什么重写equals方法时必须重写hashcode方法

作者:互联网

首先要知道为什么要重写equals方法?

那么先引出 == 和equals的区别:

所以我们想要比较两个对象的内容,就必须重写equals方法

那么为什么重写equals方法时必须重写hashcode方法?

是为了提高效率,采取重写hashcode方法,先进行hashcode比较,如果不同,那么就没必要再进行equals的比较了,这样就大大减少了equals比较的次数

本来equals方法和hashcode()是不相关的,但是由于我们会在集合中放入我们创建的对象,这样由于存储结构的问题,导致在查找时二者产生了关联。

    public static void main(String[] args) {
        Map<MyObject, Integer> map = new HashMap<MyObject, Integer>();
        HashMapTest instance = new MyObject("a");
        map.put(instance, 1);
        Integer value = map.get(new MyObject("a"));
        if (value != null) {
            System.out.println(value);
        } else {
            System.out.println("value is null");
        }
    } 
//程序运行结果: value is null

我们往一个HashMap中,放入一个自定义对象 MyObject(“a”)的实例,假设我们重写了equals,然后通过get()方法获取,为何结果为空?

原因是由于hashmap的存储结构是一个hash,作用是方便快速查找,导致如果hashcode不同(hashcode默认和内存相关),2个对象new 出来,内存地址不同,那么无法找到对应的桶,就无法找到对应的对象,因此,结果就为null。所以为了保险起见,所有的自定义类,如果重写了equals方法时必须重写hashcode方法

这里引出来什么是Hash算法

Hash是散列的意思,就是把任意长度的输入,通过散列算法变换成固定长度的输出,该输出就是散列值。关于散列值,有以下几个关键结论:

总结:

标签:对象,方法,equals,hashcode,重写,散列
来源: https://www.cnblogs.com/Cloong/p/16515372.html