HashCode()的存在是为了查找的快捷性,用于在散列存储结构中确定对象的存储地址
Hash冲突
- 两个对象 equals相等,则 hashCode()也一定相等
- 如果两个对象的 hashCode()相等, equals()方法不一定相等
解释:实际上HashCode计算值(返回int)反映的是存储的位置(可以理解为存储地址,但并非存储地址)
存在地址相等但是值不相等的情况(例如链表在同一地址上存储新的对象),这个时候HashCode相等
但equals方法(未被重写时,String类被重写了)相等于“==”,比较值和地址,因而有上述结论
HashCode重写
- 如果 equals方法被重写,则 hashCode()也应该被重写
原因:实际上这是一种默认的规则,JavaBean类的hashCode通用约定:
① 对于同一个对象多次调用hashCode时,都应该返回相同的int值
② 两个对象equals返回true时,hashCode返回值必须相等
③ 两个对象equals返回false时,hashCode返回值必须不同
例如在HashSet中,存放元素时根据HashCode找到存储位置,若该位置已有元素,则会通过equals比较。如果重写了equals方法,则并不一定严格判定“==”,当equals返回true则正常不存放,但返回false时则会以链表的形式在一个位置上存储两个值,HashSet的性能就会降低,集合也可能出现重复元素