Hash-Table (空间换时间)
- 利用哈希函数生成对应的index(o(1);
- 利用生成的index(O(1)) 来操作指定位置的元素 O(1) 时间复杂度
Hash 冲突:
- 两个不同的key ,经过哈希函数计算出相同的结果解决办法:
1) 开放定址法:按照一定规则向其他地址探测,直到遇到空桶
2) 再Hash法 :利用另一个Hash函数再次计算,看是否与第一个相
3) 链地址法:通过链表将同一index的元素串起来
JDK 1.8 解决Hash冲突:
- 默认单向链表将元素串起来
- 在添加元素时有可能将单向链表转为红黑树(当哈希表容量大于64 或者链表节点数大于8)
- 当红黑树的节点少于一定数量后,也会转成单向链表
表为什么使用单链表?
1.挨个比较key 相同就覆盖掉 不同就尾插
2. 每次从头开始比较
3. 节省空间 比双链表少一个指针
Hash 函数:
- 先生成key 的哈希值
- 再让key 的哈希值与数组的大小进行相关的计算 生成索引值(Hash(key)要小于数组)
- Hash(key)%table.length 为了提高效率 ,可以将 % 更换为 & (前提是将数组的长度设计为2En) Hash(key)&(table.length-1) ——》 按照此方法得出的数字必然小于table.length (2En -1 保证数字全部是1)
良好的哈希函数:
- 算出的索引分布比较均匀
来源:CSDN
作者:女神我好想你。
链接:https://blog.csdn.net/qq_43834878/article/details/104885170