前言
在很多时候, 很多地方, 我们都看到有文章说到, 我们新建的对象必须要重写equals()方法和hashCode()方法. why? 如果我们要比较2个对象是否相等, 那么我们重写equals()方法不就行了吗?为什么还要重写hashCode()方法呢? 今天我们就来谈谈为什么我们的对象一定要重写equals()方法和hashCode()
equals()方法
先看Object的equals()方法的实现
可以看出, Object的equals()方法是直接比较的对象的引用, 而非对象的值.而我们自己在使用equals()方法的时候, 一般都是需要对比2个对象的值是否是一致, 而非是2个对象的引用.
所以, 才会推荐我们重写equals()方法.
hashCode()方法
为什么我们还常常会推荐重写hashCode()方法呢, 这里涉及到我们常用的几个类: HashMap
HashTable
HashSet
以我们最常用的HashMap来举例:
我要向HashMap里面存储数据的时候, 假如我们存储的key是一个对象, 而且我们想要的是如果对象的值是一样的, 那么当我们用第二个相同值的对象到map里面去查询的时候, 能够查询出来之前插入的值..
接下来看一下我写的测试类:
这个是测试结果:
很明显, 我们通过相同对象去查询没有查询到结果.
那么我们先重写一下equals()方法再试试呢.
测试类修改如下:
测试结果:
我们发现结果依然是null
再接着, 我们重写hashCode()方法再试试呢
测试类修改如下:
测试结果:
哈哈哈, 总算是对了.
那么问题就来了, why? 为什么会这样呢 其实这个可以在HashMap的源码里面可以看出来.HashMap的底层是数组和链表结合起来的链表散列.我们put数据的时候, 会对key做hash(), 然后存储到对应的位置去. 如果不同的key(通过equals方法判断相同hash的key是否一致)算出来的hash值是一样的, 这个时候这个key依然会存储到一样的位置, 按照链表的方式存储在之前的key的后面.这篇文章可以帮助你更深刻的理解HashMap: blog.csdn.net/woshimaxiao…
这里我们就能明白为什么我们需要重写equals()和hashCode()了. 因为我们在编写代码的时候, 不可避免的会使用到HashMap等之类的容器. 如果我们不重写这两个方法, 就有可能会导致我们的代码发生业务错误.