搜索
写经验 领红包
 > 娱乐

为啥要重写equals(为什么重写equals还要重写hash)

导语:面试题:为什么重写equals一定要重写hashcode?

最近面试了很多人,大部分人都搞不明白为什么重写equals方法一定要重写hashcode。

大家都知道,equals和hashcode是java.lang.Object类的两个重要的方法,在实际应用中常常需要重写这两个方法。

节选自Object类上2个方法上的部分注释

这是Object类关于这两个方法的源码,可以看出,Object类默认的equals比较规则就是比较两个对象的内存地址。而hashcode是本地方法,hashcode是根据对象的内存地址经哈希算法得来的。

实际业务中一般重写equals方法主要是为了用于判断2个值一样的对象在业务上是同一个。

以上代码只重写equals看起来确实没什么问题,但是如何使用Hash散列方式存储对象的数据结构:HashSet、HashMap、HashTable等,仅仅重载equals方法可能会导致实际业务逻辑失败。

看下面的代码,结果是HashMap没有把te和te1当作同一key,原因是

hashmap判断key是否重复是调用key的equals和hashcode方法来判断的,

由于我们没有重写hashcode,那么te和te1获取到的hashcode值是不一样的。

下面我们重写hashCode方法,结果就是2个对象在hashmap中以一个key值存储。

结论:重写了equals()方法,是为了让2个对象在某种业务上看作是相同的,而你的对象可能会放入到散列方式存储对象的数据结构(HashMap,HashTable或HashSet等)中时,那么还必须重写hashCode()。

本文内容由快快网络小舻创作整理编辑!