一、什么是hashCode
1、hash和hash表
首先,在了解hashCode之前,我们要知道什么是hash。
通过百度,我们可以了解到hash是一个函数,这个函数具体实现则是有一系列的算法。通过这一系列的算法,将任意的输入转变为固定长度的输出,这个输出就是 hash值。谈到hash值,就又要说到一个东西,那就是hash表,hash表是通过键值对(key-value)的方式来存放hash值的查找表。
2、hashCode
有了前面对hash和hash表的了解,我们就不难知道,hashCode就是通过hash函数得到的一个记录对象在hash表中索引位置的值。
hashCode()方法定义在JDK的Obejct中,这也就意味着,java中所有的类包含有hashCode()函数。
二、为什么要有hashCode
hashCode的存在是为了查找的快捷性,前面也说到了,hashcode是一个记录对象在hash表中索引位置的值。
这里我们可以以“HashSet如何检索重复”为例子来说明:
当我们把对象加入HashSet的时候,HashSet会先计算对象的hashCode值,来判断对象的加入位置,同时也会与HashSet中其他以及加入的对象的hashCode做比较,如果没有相同的hashCode,HashSet会假设对象没有重复出现。如果有相同hashCode的对象,这是就会调用equals对象,比较两个对象是否相等,如果两个对象相等,就不会进行加入操作,如果两个对象不同,就会重新散列到其他位置上去。这样的操作大大降低了我们equals的操作次数,提高了执行速度。
三、hashCode和equals相关规定
通过上面的例子,我们也不难知道,是先通过比较hashCode,如果hashCode相同,再通过equals比较两个对象是否相等。所以也就有了以下的一些规定:
1、如果两个对象相等、则hashCode一定相同。
2、两个对象相等,则两个对象分别调用equals方法都返回true。
3、两个对象hashCode相同,并不意味着他们两个相等。
4、如果equals被重写,则hashCode也要被覆盖
第4点是因为,hashCoded的默认行为是对堆上的对象产生一个特有的值,如果hashCode没有被重写,那么这个类的两个对象无论如何都不会相等,即使是指向相同的数据。