HashMap的get和put方法过程
2021-07-14 10:56:10 0 举报
HashMap的get和put方法过程
作者其他创作
大纲/内容
为null
get方法
2.4、是否是最后一个是的
newThr=0
JDK1.7
hashMap
1、原数组长度大于最大容量(1073741824) 则将threshold设为Integer.MAX_VALUE2、反之新数组是原来2倍
为红黑树
2、当key为null
如果1和2都不满足就设置16作为初始化值
则使用红黑树的方式获取对应的key
初始化hashMap初始值为2的n次方 inflateTable(int toSize)
1、符合要求的元素(即 lXXX 树),在元素个数小于等于 6 时还原成链表,最后让哈希表中修剪的痛 tab[index] 指向 lXXX 树;在元素个数大于 6 时,还是用红黑树,只不过是修剪了下枝叶;2、不符合要求的元素(即 hXXX 树)也是一样的操作,只不过最后它是放在了修剪范围外 tab[index + bit]。
如果原来的table有数据,则将数据复制到新的table中
1、如果key和hashmap都不为null,通过获得key的hash值。2、在遍历链表,对比hash和key(== 和 equal),都满足返回Entry
不是红黑树
3.不扩容
那就用 临界值(oldThr)做初始化值
1、数组长度(oldCap0)
5、不是红黑树
1、先计算key值hash值在通过hash和数据长度计算下标,获得链表
3.1、遍历链表,key和hash不想同
put方法
扩容
5、是红黑树
2、如果数组为空
2.2、满足添加
3.1、遍历链表,key和hash想同
3.2、判断是否扩容
3、当key不为null
newThr不为0
初始化并计算计算key的下标
2、如果数组不为空
如果临界值为newThr
3.3、扩容
指定位置、指定范围,让指定位置中的元素 (hash & bit) == 0 的,放到 lXXX 树中,不相等的放到 hXXX 树中。
要判断是链表还是红黑树
2.1、hashmap是null
判断hashmap中所有entry的数量是否大于扩容临界值并且指定下标处的entry[]数组元素不为null 触发扩容
把这个value对应的entry放进table[0]位置中
3、当该值key和hash相同
不为null
4、当不相同
判断当前链表是否是红黑
从hashmap数组下标为0的位置获取值返回
1、hash(key)
遍历hashmap每个bucket里的链表,每个链表可能会被拆分成两个链表,不需要移动的元素置入loHead为首的链表,需要移动的元素置入hiHead为首的链表,然后分别分配给老的buket(newTab[j] = loHead)和新的buket(newTab[j + oldCap] = hiHead)。
扩容resize()
2、2.根据元素个数决定处理情况
直接返回
1、判断hashmap数组为null
(1) 扩容是一个特别耗性能的操作,所以当程序员在使用HashMap的时候,估算map的大小,初始化的时候给一个大致的数值,避免map进行频繁的扩容。(2) 负载因子是可以修改的,也可以大于1,但是建议不要轻易修改,除非情况非常特殊。(3) HashMap是线程不安全的,不要在并发的环境中同时操作HashMap,建议使用ConcurrentHashMap。(4) JDK1.8引入红黑树大程度优化了HashMap的性能。(5) 还没升级JDK1.8的,现在开始升级吧。HashMap的性能提升仅仅是JDK1.8的冰山一角。
1、hashmap中的数组为null或长度为0
2、如果临界值(oldCap 0)
2.2、hashmap不是null
1、获取hashmap中的数组和数组长度是否为null
数组对应下标的位置是否为空
JDK1.8
// 在默认无参数初始化会有这种情况 newCap = DEFAULT_INITIAL_CAPACITY;// 16 newThr = (int) (DEFAULT_LOAD_FACTOR*DEFAULT_INITIAL_CAPACITY);// 0.75*16=12
JDK1.7中rehash的时候,旧链表迁移新链表的时候,如果在新表的数组索引位置相同,则链表元素会倒置,
2、当key不为null
为链表时
2.1、是否满足条件(key和hash是否相同)
调用红黑树链表put的方法
则先获取对应链表的第一个值
是红黑树
1、当key为null是
2.5、不是最后一个
2.3、不满足
直接放回null
获取对应key为要查询的key的entry(getEntry(key))
2、hashmap不为null和0
如果节点是红黑树节点,就会调用TreeNode的split方法对当前节点作为跟节点的红黑树进行修剪 主要分两部分,先分类、再根据元素个数决定是还原成链表还是精简一下元素仍保留红黑树结构。
1、分类
0 条评论
回复 删除
下一页