一:哈希表(散列表)

重点:数组与链表的缺点:

      数组查找的时候通过下标查找效率很高,但是我们插入删除的时候,效率很低,比如我们删除一个靠前的数据,就需要将后面的数据依次向前移动。如ArrayList底层用的是数组

      链表插入删除的时候效率是比较高的,但是当我们查询的时候,是需要都遍历一遍去查找,效率是非常低的,所以出现了哈希表:如Linkedlist底层用的是链表

一:哈希表又叫散列表,结构由数组+链表 或者 数组+红黑树(二叉树,是一个平衡二叉树)

二:哈希函数

        能够将一个数值转换为哈希值(整数), 然后用哈希值与数值的长度取余,将数据插入到哈希表中。

三:哈希冲突(指的 是key值不相同,但是哈希值相同)

       哈希表使用 key值通过哈希函数 来计算数组的索引(计算出key的哈希值后与数组的长度进行取余:哈希值%数组长度),

       进而存取数组中对应索引位置的值。当俩个key具有相同的数组下标的时候,我们需要进行处理哈希冲突,我们再进行比较key值是否相同,如果相同的话,

       我们将新的value替换旧的value值。如果key不相同的话,我们将新的数据添加到哈希表中

处理哈希冲突:开放寻址法,连地址法

       开放寻址法:就是当前下标的数组位置已经有数据了,并且key是不相同的,我们将当前数据下移到下一个数组位置,如果下一个数组位置也有数据并且key值不相同,那么我们继续这样找。

       链地址法:由于开放寻址法遇到冲突我们就移动位置,为什么不在原地进行处理,于是出现了链地址法: 当我们的哈希值相同的时候,我们将其放入同一个桶中。  

四:哈希表支持的操作

       add(Key key , Value value) :将一对新的键值对加入哈希表中

       get(Key key);通过特定的关键字拿到其所对应的数值

       remove(Key key);通过关键字,删除哈希表中的键值对

       getSize();当前键值对的数量;

       isEmpty():查看哈希表是否为空;      

 

 五:扩容机制

     装载因子: 装载因子=元素个数/散链表的长度

                   当表的装载因子达到默认表的装载因子时进行扩容

                   

     什么情况下扩容

                常见的情况是在填装因子(loaderFactor) > 0.75是进行扩容

posted @ 2022-03-21 13:52  iLisa  阅读(59)  评论(0编辑  收藏  举报