1、hashcode
1.1 什么是hashcode
简而言之,把任意长度的输入通过hash算法变换成固定长度的输出,该输出就是hashcode。
比如 输入a -----> 算法计算 ------> 输出1,这个1就是hashcode。
1.2 hashcode有什么用
一定程度的快速去重。
思考一下如何实现将一组数据去重,存入容量为一百的数组?
如果按照常规的思路去重,我们会将这组数据的值逐个放入数组,并且放入的时候,我们需要拿这个值跟数组中已有的每一个值进行对比,如果没有相同的,就说明没有重复的。
实际上这种逐个比较的思路效率比较低。
现在我们换个思路:
我们采用一种算法,任何输入字符,经过算法计算后,均会输出一个值。任何输出也只会对应一个之输出值。
那么,如果输出的值不一样,我们就可以判定输入的值一定不同。
那么如何利用这个输出的值来进行存储和快速去重呢?
其实我们可以直接用这个值对数组长度求余,得到的值就是这个字符所存位置的下标。如果两个输入的经过计算后得到的下标不同,那么它们一定是不同的,这就实现了快速去重的目的。
那么,如果两个输入的下标相同,它们一定是相同的么?
答案是否定的,比如我们输入101个不同的字符,那根据输出得到的下标至少会存在两个相同的下标。这种情况就是hash冲突,在此就不再展开了。
总而言之,hashcode是将输入用hash算法计算得到的值。hashcode不同,输入一定不同,hashcode相同,输入不一定相同。
2、hashcode和equals方法
set等数据结构进行存储的时候,会先采用hashcode初步判断对象a和对象b是不是相同。
- 如果对象a和对象b的hashcode不相同,那么它们一定是不同的。
- 如何对象a和对象b的hashcode相同,那么它们可能是不同的。这种情况就需要采用equals方法进一步判断对象a和对象b是否相同。
如果只重写equals,去根据对象的值判断对象是否相。但是hashcode的计算却不是依据对象的值,那么就会出现对象a和对象b的值相同,但是它们的hashcode可能不相等的情况。
存储的时候,系统在初步判定阶段就会判定对象a和对象b不重复,也就不会进一步采用equals判断对象是否相同,从而导致数据错误。
因此需要重写equals时,也要重写hashcode方法。