文章目录
一、什么是HashMap
HashMap 是一种快速的查找并且插入、删除性能都良好的一种 K/V键值对的数据结构,key唯一,value允许重复它基于哈希表的 Map 接口实现,是常用的 Java 集合之一,是非线程安全的。
二、HashMap的数据结构
2.1 数据结构
HashMap的数组结构是数组+链表+红黑树进行存储。数组类型为Node[]节点。
1.按照key,重新计算hash值(让新的哈希值冲突概率更低,更散列)
2.按照hash值,计算在数组中存储的下标位置
3.判断该下标位置是否存在元素
3.1如果该位置没有保存元素,则直接存入当前键值对
3.2如果该位置已经保存元素,则以链表方式,将当前键值对保存至链表尾部(尾插法)
3.3如果链表长度大于8,
为了提供搜索效率(链表不利于搜索),
会将链表转换为红黑树(红黑树,有序的自平衡二叉树,可以进行二分查找)
注意
HashMap
key唯一: 保存的过程中,判断key是否一致,如果key相同,则覆盖
无序: 添加的顺序与存储的顺序不一致,输出时按照存储顺序
2.2 解决哈希冲突的方法
如何解决哈希冲突:
1、开放定址法:我们在遇到哈希冲突时,去寻找一个新的空闲的哈希地址
2、再哈希法:同时构造多个不同的哈希函数,等发生哈希冲突时就使用第二个、第三个……等其他的哈希函数计算地址,直到不发生冲突为止。虽然不易发生聚集,但是增加了计算时间。
3、链地址法:将所有哈希地址相同的记录都链接在同一链表中。
4、建立公共溢出区:将哈希表分为基本表和溢出表,将发生冲突的都存放在溢出表中。
三、HashMap的扩容方式
扩容方法:resize()
扩容机制:原数组的2倍