散列表是什么?
就是元素为链表的数组。
存值
已Map为例子,Map的Entry就是一个链表实现,主要属性为,key,value,next。next就是链表下一个对象。
1.计算key,hash值
2.hash值对数组长度取模,得到下标
3.取出下标对应链表,若为空新建Entry对象。
4.不为空,判断key是否相等(key hash值碰撞,key对象相等判断),若相等成立,替换value值。
5.不相等,判断链表长度是否超过临界值(计算得,跟偏移量有关)。
6.不超过,添加新Entry对象,关联上一个Entry对象
7.超过,扩容数组,调整已有数据,重新执行一遍添加流程。
取值
1.计算key,hash值
2.hash值对数组长度取模,得到下标
3.取出下标对应链表,若为空 返回null
4.不为空,遍历该列表,查询相等key
5.有,返回value结束查询
6.没有,到链表末尾都无匹配项,返回null