前几天面试时候遇到这样一个问题:hash底层是怎么解决哈希碰撞的,刚遇到这个问题是云里雾里,根本就是什么也不懂,今天突然想起,索性也就查了一查,其实平时开发中很少用到,一般都是面试时候才会用到,但是了解一些对以后的开发和基础知识的构建我相信还是有很大帮助的。
官方解释: 如果两个输入串的hash函数的值一样,则称这两个串是一个碰撞(Collision)。
我自己的理解: 足够多个对象存入到 哈希表中,必然有hashCode相同的情况,那么就出现了哈希碰撞。
哈希表对哈希碰撞的处理方式:
A、开放地址法:
1、线性探测:从要插入的位置线性依次向下的探测空白单元,如第5343个被占用,则探测第5344个位置。
2、二次探测法:与线性探测类似 ,只不过每次都是前更多的坐标数,以避免哈希聚集(当x+1位置有元素时候,他就认为这里有个小聚集,然后探测x+4,x+9/…以此类推)
3、再哈希法:构造若干个哈希函数,当发生冲突时,根据另一个哈希函数计算下一个哈希地址,直到冲突不再发 生。
B、链地址法:
每个单元都设置链表而不是要插入的对象,当出现地址冲突的时候,存入后面的链接地址中