如果没有复写父类的hashCode就会分配一个不同的地址,这样已经说明两个元素不同了,就不会再调用equals比较了,刚才我也想到了这个问题,下边是一个兄弟总结的,觉得不错,你也看下
1 哈希算法的原理:
将集合分成若干个存储区域,每个对象可以计算出一个哈希码,可以将哈希码分组,每组对应某个存储区域,根据一个对象的哈希码就可以确定该对象存储在哪个区域。
2 HashSet 集合的工作原理
就是采用哈希算法存取对象的集合,它内部采用对某个数字n进行取余的方式对哈希码进行分组和划分对象的存储区域,HashSet集合在比较的时候先算出对象的哈希值,找到相应的存储区,当然哈希码不同就不用比较了,若相同,然后再取出该区域的每个元素和对象用equals方法进行比较,这样不用遍历集合中的元素就可以得到结论。可见HashSet集合具有很好的对象检索性能。
3 什么时候覆盖HashCode方法?
为了让两个相等的对象也放在相同的区域,那么如果两个对象equals 相等,那么应该让他们的HashCode也相等,达到逻辑上一致,这样就可以在同一个区域进行比较, 防止相等的元素重复存入,当然前提是放在哈希集合中。
希望对楼主对于哈希集合的理解有所帮助 |