问题缘由:重写equals时必须要重写hashCode方法
简介
hashCode()的作用是获取哈希码, 也称为散列码,它实际上就是一个int整数, 这个哈希码的作用是确定该对象在哈希表中的索引位置。hashCode定义在JDK的Object中, 这就意味者所有的类都含有hashCode方法
散列表存储的是键值对, 它的特点是, 能够根据键快速检索出对应的值, 其中就利用到了散列码。
哈希码的作用是获取对象在哈希表中的索引位置。
HashSet的插入机制
HashSet不允许重复的插入, 在每一次插入时, 会根据hashCode来判断对象的插入位置, 同时会与已经存在的hashcode作比较, 如果没有相符的hashCode, 则没有重复的对象, 如果有重复的hashCode, 则会使用equals来判断值是否相等, 若相等则不插入, 若不相等则重新散列到其它位置, 这样可以大大减少equals的次数, 大大提高执行速度。
重写equals时必须要重写hashCode方法
因为在使用equals之前,首先是使用hashcode去判断对象的索引位置, hashCode() 的默认行为是对堆上的对象产生独特值。如果没有重写 hashCode(),则该 class 的两个对象无论如何都不会相等(即使这两个对象指向相同的数据)
demo
1 | import java.util.*; |