当我们对某个元素进行哈希运算
,得到一个存储地址
,然后要进行插入的时候,发现已经被其他元素占用
了,其实这就是所谓的哈希冲突,也叫哈希碰撞。
哈希函数的设计至关重要,好的哈希函数会尽可能地保证 计算简单
和散列地址分布均匀
,但是,我们需要清楚的是,数组是一块连续的固定长度的内存空间,再好的哈希函数也不能保证得到的存储地址绝对不发生冲突。那么哈希冲突如何解决呢?
哈希冲突的解决方案有多种:开放地址法
(发生冲突,继续寻找下一块未被占用的存储地址),再散列函数法
,链地址法
,而HashMap即是采用了链地址法,也就是数组+链表
的方式,
简单来说,HashMap由数组+链表组成
的,数组是HashMap的主体
,链表则是主要为了解决哈希冲突而存在的
,如果定位到的数组位置不含链表
(当前entry的next指向null),那么对于查找,添加等操作很快,仅需一次寻址即可
;如果定位到的数组包含链表
,对于添加操作,其时间复杂度为O(n)
,首先遍历链表,存在即覆盖,否则新增;对于查找操作来讲,仍需遍历链表,然后通过key对象的equals方法逐一比对查找。所以,性能考虑
,HashMap中的链表出现越少,性能才会越好
。