一:哈希表(散列表)
重点:数组与链表的缺点:
数组查找的时候通过下标查找效率很高,但是我们插入删除的时候,效率很低,比如我们删除一个靠前的数据,就需要将后面的数据依次向前移动。如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是进行扩容