1.8 HashMap文字描述(复习)

1、查找

(1)通过hash求余找到相应的桶,如果桶的节点是是链表节点则(2),如果是红黑树节点则(3)

(2)遍历链表比较hash,和通过equals比较,找到相等的

(3)红黑树的查找,和二分搜索树没什么差别,也是通过key的hash和equals找到相等的

2、插入

(1)当桶数组 table 为空时,通过扩容的方式初始化 table

(2)如果桶中没有任何节点,则新插入节点直接插入到这个桶中

(3)如果该桶的节点是链表节点类型,则将键值对插入链表中,并根据链表长度决定是否将链表转为红黑树

(4)如果该桶的节点是树节点,则将键值对插入红黑树中。

(5)判断键值对数量是否大于阈值,大于的话则进行扩容操作

3、扩容

扫描二维码关注公众号,回复: 4936097 查看本文章

(1)计算新桶数组的容量 newCap 和新阈值 newThr

(2)根据计算出的 newCap 创建新的桶数组,桶数组 table 也是在这里进行初始化的

(3)将键值对节点重新映射到新的桶数组里。如果节点是 TreeNode 类型,则需要拆分红黑树。如果是普通节点,则节点按原顺序进行分组。其中,拆分红黑树时,因为树节点还是保持了链表引用的,所以和拆分链表差不多,拆成两组链表,然后再判断拆分后的链表是否要转换成红黑树。

4、删除

(1)定位桶位置

(2)如果是链表则遍历链表并找到键值相等的节点,然后删除

(3)如果是红黑树则使用红黑树方式删除节点

具体细节请看https://blog.csdn.net/qq_36951116/article/details/86288516

猜你喜欢

转载自blog.csdn.net/qq_36951116/article/details/86300557