HashMap的判断重复和解决哈希冲突

哈希冲突
当用key的hashCode()得到了相应的存储位置,并用equals()判断是否有相同的key时,若key不相等就产生了哈希冲突,要用链地址法存储.相同的话就得value覆盖旧的value.
HashMap的put()用hashCode() && equals() 判断key是否重复
Java的规范1:
若重写equals(Object obj)方法,有必要重写hashcode()方法,确保通过equals(Object obj)方法判断结果为true的两个对象具备相等的hashcode()返回值。说得简单点就是:“如果两个对象相同,那么他们的hashcode应该 相等”。不过请注意:这个只是规范,如果你非要写一个类让equals(Object obj)返回true而hashcode()返回两个不相等的值,编译和运行都是不会报错的。不过这样违反了Java规范,程序也就埋下了BUG。
Java的规范2:
如果equals(Object obj)返回false,即两个对象“不相同”,并不要求对这两个对象调用hashcode()方法得到两个不相同的数。说的简单点就是:“如果两个对象不相同,他们的hashcode可能相同”。
可以推出的结论
1、如果两个对象equals,Java运行时环境会认为他们的hashcode一定相等。
2、如果两个对象不equals,他们的hashcode有可能相等。
3、如果两个对象hashcode相等,他们不一定equals。
4、如果两个对象hashcode不相等,他们一定不equals。
put方法
当put一对<key,value>时,先用hashCode() && equals() 判断key是否重复
如果重复则不插入
如果hashCode()为true,则会用hashCode判断在相应的位置插入key,如果这个判断的位置已经有了值了,则会调用equals()去判断是否重复,equals()为true则视为key重复不插入,若equals()为false则认为不重复,以链的形式插入
get方法
首先得到key的hashCode()去得到值存的位置,然后用equals()去一个一个比较,为true则就是相应的value,否则不是
HashMap的判断重复和解决哈希冲突
https://blog.****.net/prh1023/article/details/80652704
https://blog.****.net/weixin_37751634/article/details/82882222