图片源自网络
HashMap的数据结构
数据结构是通过数组和链表实现的对数据储存
链表特点:寻址困难,插入删除容易
数组特点:寻址容易,插入删除难
哈希表: 链表的数组 默认链表长度 16
疑问:如果两个key通过hashMap得到相同的index 会不会覆盖
解答:这里要补充一个属性,hashMap 有 key value next 三个属性
其中 next 是指index相同的 通过next 连接在一起 的A,B,C等键对值
解决Hash冲突的办法
1. 开放地址法
开发地址法就是一旦发生冲突,就去寻找下一个空的散列地址,只要散列地址足够大,空的散列地址总能找到,并将其记录
2. 再散列函数
Hi=RHi(key), i=1,2,…,k RHi均是不同的散列函数(比如除留余数、折叠、平方取中),在同义词产生地址冲突时就换用另一个散列函数计算散列地址,直到碰撞不再发生,这种方法不易产生“聚集”,但增加了计算时间。
3. 链地址法
将所有关键字为同义词的记录存储在一个单链表中,称这种表为同义词子表,在散列表中只存储所有同义词子表的头指针。
链地址法对于可能会造成很多冲突散列函数来说,提供了绝不会出现找不到地址的保障。但也就带来了查找时需要遍历单链表的性能损耗。
4. 公共溢出区法
为所有冲突的关键字记录建立一个公共的溢出区来存放。在查找时,对给定关键字通过散列函数计算出散列地址后,先与基本表的相应位置进行比对,如果相等,则查找成功;如果不相等,则到溢出表进行顺序查找。如果相对于基本表而言,在有冲突的数据很少的情况下,公共溢出区的结构对查找性能来说还是非常高的。