为什么我们需要重写equals()方法和hashCode()方法

337 阅读2分钟

前言

在很多时候, 很多地方, 我们都看到有文章说到, 我们新建的对象必须要重写equals()方法和hashCode()方法. why? 如果我们要比较2个对象是否相等, 那么我们重写equals()方法不就行了吗?为什么还要重写hashCode()方法呢? 今天我们就来谈谈为什么我们的对象一定要重写equals()方法和hashCode()

equals()方法

先看Object的equals()方法的实现 image.png 可以看出, Object的equals()方法是直接比较的对象的引用, 而非对象的值.而我们自己在使用equals()方法的时候, 一般都是需要对比2个对象的值是否是一致, 而非是2个对象的引用. 所以, 才会推荐我们重写equals()方法.

hashCode()方法

为什么我们还常常会推荐重写hashCode()方法呢, 这里涉及到我们常用的几个类: HashMap HashTable HashSet

以我们最常用的HashMap来举例: 我要向HashMap里面存储数据的时候, 假如我们存储的key是一个对象, 而且我们想要的是如果对象的值是一样的, 那么当我们用第二个相同值的对象到map里面去查询的时候, 能够查询出来之前插入的值.. 接下来看一下我写的测试类: image.png

这个是测试结果: image.png

很明显, 我们通过相同对象去查询没有查询到结果.

那么我们先重写一下equals()方法再试试呢. 测试类修改如下: image.png

测试结果: image.png

我们发现结果依然是null

再接着, 我们重写hashCode()方法再试试呢 测试类修改如下: image.png

测试结果: image.png

哈哈哈, 总算是对了.

那么问题就来了, why? 为什么会这样呢 其实这个可以在HashMap的源码里面可以看出来.HashMap的底层是数组和链表结合起来的链表散列.我们put数据的时候, 会对key做hash(), 然后存储到对应的位置去. 如果不同的key(通过equals方法判断相同hash的key是否一致)算出来的hash值是一样的, 这个时候这个key依然会存储到一样的位置, 按照链表的方式存储在之前的key的后面.这篇文章可以帮助你更深刻的理解HashMap: blog.csdn.net/woshimaxiao…

这里我们就能明白为什么我们需要重写equals()和hashCode()了. 因为我们在编写代码的时候, 不可避免的会使用到HashMap等之类的容器. 如果我们不重写这两个方法, 就有可能会导致我们的代码发生业务错误.