HashMap——散列函数与哈希冲突

table数组中,一个entry数据结构对应一条链表,也就是一个哈希桶,有相同hash值的存放在一条链表上,不同hashcode返回值区分链表上的键值对。
为了防止单链表的产生,要正确的选择散列函数

散列函数:映射地址的函数,有几种方式

1.直接定址法:选择某个关键字key的线性函数得到的地址作为散列地址
2.除留取余法:关键字除以某个比散列表长度小的素数得到的余数作为散列地址
3.平均取中法:关键字平方后,根据散列表大小取中间的几位作为散列地址
4.折叠法:将关键字分为若干组位,每一组的位数由散列表大小决定,最后一组可以短一些补零,把这些位数相加得到散列地址
5.随机数法:选择一个随机函数,用关键字的随机函数得到的值作为散列地址
6.数学分析法:分析关键字的各个位数,每个位会出现若干种不同的符号,选择符号易于区分开并且分布均匀的位作为散列地址

当不同的key落到相同的散列地址时,会发生冲突,也就是哈希冲突
冲突避免方法:

一、.开放地址法

Hi=(H(key)+di) MOD m i=1,2,…,k(k<=m-1)
其中m为表长,di为增量序列

1.线性探测
如果di值可能为1,2,3,…m-1,称线性探测再散列。
即检测下一地址是否可以插入,如果可以就放入下一地址,如果不可以继续向下一地址检测

2.二次探测
如果di取值可能为1,-1,2,-2,4,-4,9,-9,16,-16,…kk,-kk(k<=m/2),称二次探测再散列。
因为线性探测插入的key值太集中,这样key值很难存放到映射的散列地址上

二、哈希桶 开链法
有相同散列地址的key-value构成一个链表,也就是哈希桶
可以将单链表变为红黑树提高效率(?)
HashMap——散列函数与哈希冲突

ps:素数表作为哈希表的长度可以降低哈希冲突