重写equals方法一般需要重写hashCode方法的原因

equals方法和hashCode方法都是Object类中的方法,其中equals方法在Object中有一个简单的实现:

    public boolean equals(Object obj) {
        return (this == obj);
    }

也就是说默认情况下,只有两个对象的引用相同,则equals返回true,这是很严格的条件,但是我们的需求中,判断对象相等有时候可能并不需要这么苛刻的条件,比如说只需要两个对象的所有属性值是一样的就判定两个对象相等。

该方法上方有一段说明:

Note that it is generally necessary to override the hashCode method whenever this method is overridden, so as to maintain the general contract for the hashCode method, which states that equal objects must have equal hash codes.

大意就是重写equals方法的时候一般需要重写hashCode方法,目的是为了维持hashCode方法的约定,即:两个对象如果equals,则这两个对象必须有相同的hashcode。其原因是在一些基于hash的操作中,比如在HashMap, HashSet, HashTable等容器类中,其底层采用的是Hash表的数据结构,为了快速定位元素的位置,将采用对象的hashcode(间接采用)进行定位,如果通过hashcode定位到一个位置,该位置没有元素,则可以将该元素插入该处。

Object类中的hashCode方法是一个native方法:

    public native int hashCode();
该native方法的实现保证,不同的对象(即利用==进行判断返回值为false)具有不同的hashCode,因此,如果重写了equals方法(两个对象只要属性值相同就说明这两个对象相等),但是没有重写hashCode方法的话,就会有问题。比如向一个已经包含了100万个元素的HashSet中添加元素,为了提高效率,我们会通过要添加的元素的hashCode来定位添加的位置,如果定位到的位置没有其他元素,就说明集合中没有这个元素,可以添加,由于没有重写hashCode方法,则根据hashCode的默认实现,只要用==判断两个对象不相等,则这两个对象就有不同的hashCode,因此就算是要添加的元素equals集合中已经存在的某个元素,该元素同样会被添加到集合中,也就是在集合中会存在equals的元素,这不是我们想要的结果。因此在重写equals方法的时候我们应该重写hashCode方法,用来保证两点:第一,a.equals(b)为true,则a.hashCode() == b.hashCode() 为true;第二,a.hashCode() == b.hashCode()为false,则a.equals(b)必须为false。

水平有限,如有不当之处,还望指正!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值