原文地址:https://www.cnblogs.com/chengxiao/p/6059914.html

什么是哈希表

哈希表的主干就是一个数组。如果要新增或删除一个元素,可以把该元素的关键字,通过某个函数映射到数组中的某个位置,通过数组下标一次定位就可完成操作。这个函数叫哈希函数。
HashMap的原理
然而万事无完美,如果两个不同的元素,通过哈希函数得出的实际存储地址相同怎么办?也就是说,当我们对某个元素进行哈希运算,得到一个存储地址,然后要进行插入的时候,发现已经被其他元素占用了,其实这就是所谓的哈希冲突,也叫哈希碰撞。前面我们提到过,哈希函数的设计至关重要,好的哈希函数会尽可能地保证计算简单和散列地址分布均匀,但是,我们需要清楚的是,数组是一块连续的固定长度的内存空间,再好的哈希函数也不能保证得到的存储地址绝对不发生冲突。那么哈希冲突如何解决呢?哈希冲突的解决方案有多种:开放定址法(发生冲突,继续寻找下一块未被占用的存储地址),再散列函数法,链地址法,而HashMap即是采用了链地址法,也就是数组+链表的方式。

HashMap原理

存储位置的确定流程:
HashMap的原理
HashMap的主干是一个Entry数组。Entry是HashMap的基本组成单元,,每一个Entry包含一个key-value键值对。
HashMap的整体结构如下:
HashMap的原理
简单来说,HashMap由数组+链表组成的,数组是HashMap的主体,链表则是主要为了解决哈希冲突而存在的,如果定位到的数组位置不含链表(当前entry的next指向null),那么对于查找,添加等操作很快,仅需一次寻址即可;如果定位到的数组包含链表,对于添加操作,其时间复杂度为O(n),首先遍历链表,存在即覆盖,否则新增;对于查找操作来讲,仍需遍历链表,然后通过key对象的equals方法逐一比对查找。所以,性能考虑,HashMap中的链表出现越少,性能才会越好。

相关文章:

  • 2021-04-27
  • 2021-06-14
猜你喜欢
  • 2021-11-04
  • 2022-01-14
  • 2021-11-02
相关资源
相似解决方案