哈希冲突概念

两个不同元素通过哈希函数得出的实际存储地址相同,即对某个元素进行哈希运算时得到一个地址,然后进行插入时发现被其他元素占用。哈希冲突也叫哈希碰撞

设计哈希函数是为了尽可能保证计算简单和散列地址分布均匀,数组是一块连续的固定长度的内存空间,再好的哈希函数也不能保证得到的内存地址绝不会发生冲突。

哈希冲突解决方案

1) 开放地址法:发生冲突,继续寻找下一块未被占用的存储地址。

基本思想:当关键字key的哈希地址p=H(key)出现冲突时,以p为基础,产生另一个哈希地址p1,如果p1仍然冲突,再以p为基础,产生另一个哈希地址p2,…,直到找出一个不冲突的哈希地址pi,将相应元素存入其中。

2) 再散列函数法

基本思想:同时构造多个不同的哈希函数 [Hi =RH1( key)i=1, 2, …, k] 当哈希地址 Hi =RH1 ( key)发生冲突时,再计算 Hi =RH2( key)……,直到冲突不再产生。这种方法不易产生聚集,但增加了计算时间。

3) 链地址法:HashMap采用了该方法,即数组+链表的形式。

基本思想:将所有哈希地址为 i的元素构成一个称为同义词链的单链表,并将单链表的头指针存在哈希表的第 i个单元中,因而查找、插入和删除主要在同义词链中进行。链地址法适用于经常进行插入和删除的情况。

注意:

1) 相同对象,hashCode必然相同。hashCode相同的两个对象不一定是相同对象。

2) 判断对象是否相同,采用equal方法。x.equals(y) == true 表示x和y是相同对象。