HashMap如何应对hash collision? 只通过key的hashCode()来区分key是不够的,因为两个不同key的hash code很容易就重合了。
当hash-code重合时,区分的办法就是 ==和equals()方法了;如果两个key的hashCode()相同而但equals()和==都不同,则将这两个key散列到同一个桶上,但不互相覆盖。
为求明白,可以总结一下equals(), ==, hashCode()呈现不同结果时,HashMap的不同行为:
两个key的hashCode()相等? | 两个key是同一个对象? | 两个key的equals() == true? | 是否导致覆盖 | 备注 |
true | true | true | 是 | |
true | true | false | N/A | |
true | false | true | 是 | |
true | false | false | 否 | |
false | true | true | 否 | 单个key对象存入HashMap后,hashCode发生修改,然后再存一次 |
false | true | false | N/A | |
false | false | true | 否 | |
false | false | false | 否 |