HashMap的put方法源码解析(详解)
2021/4/18 14:25:29
本文主要是介绍HashMap的put方法源码解析(详解),对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
final V putVal(int hash, K key, V value, boolean onlyIfAbsent, boolean evict) { Node<K, V>[] tab; Node<K, V> p; int n, i; if ((tab = table) == null || (n = tab.length) == 0)//如果table是空的,就对table进行初始化 n = (tab = resize()).length;//获取table初始化后的长度, if ((p = tab[i = (n - 1) & hash]) == null)//如果table[i]首位置上是空的,则新建个节点,如果不空,走分支。 (p = tab[i = (n - 1) & hash]将table[i]的首节点赋值给p,后续用于判断table[i]下的节点是红黑树还是链表) tab[i] = newNode(hash, key, value, null); else { Node<K, V> e; K k; if (p.hash == hash && ((k = p.key) == key || (key != null && key.equals(k)))) //(该步骤是为了获取整个数据串的数据类型)如果该节点通过Hash和equals的比较,进行判断(满足hash值一样的前提下,key值相同或equals比较的结果一致,说明key值一致,则要对该节点进行替换) e = p; else if (p instanceof TreeNode)//判断该节点是否属于红黑树的结构,如果是则进入红黑树的插入操作,不是则进入链表的插入操作 e = ((TreeNode<K, V>) p).putTreeVal(this, tab, hash, key, value); else { for (int binCount = 0; ; ++binCount) { if ((e = p.next) == null) {//如果遍历链表节点到最后一个,则直接将该元素插入链表中 p.next = newNode(hash, key, value, null); if (binCount >= TREEIFY_THRESHOLD - 1) // -1 for 1st 如果节点的个数>8,转为红黑树 treeifyBin(tab, hash); break; } if (e.hash == hash && ((k = e.key) == key || (key != null && key.equals(k))))//如果在遍历过程发现,key值重复就要进行跳出循环 break; p = e; } } if (e != null) { // existing mapping for key //如果key值重复,则进行value替换 V oldValue = e.value; if (!onlyIfAbsent || oldValue == null) e.value = value; afterNodeAccess(e);// move node to last return oldValue;//返回旧值 } } ++modCount; //判断当前table大小是否大于阈值,如果是进行扩容 if (++size > threshold) resize(); afterNodeInsertion(evict); return null; }
这篇关于HashMap的put方法源码解析(详解)的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-12-27OpenFeign服务间调用学习入门
- 2024-12-27OpenFeign服务间调用学习入门
- 2024-12-27OpenFeign学习入门:轻松掌握微服务通信
- 2024-12-27OpenFeign学习入门:轻松掌握微服务间的HTTP请求
- 2024-12-27JDK17新特性学习入门:简洁教程带你轻松上手
- 2024-12-27JMeter传递token学习入门教程
- 2024-12-27JMeter压测学习入门指南
- 2024-12-27JWT单点登录学习入门指南
- 2024-12-27JWT单点登录原理学习入门
- 2024-12-27JWT单点登录原理学习入门