HashMap中的添加数据put方法

网友投稿 276 2022-11-30

HashMap中的添加数据put方法

//测试类public class Test { public static void main(String[] args) { HashMap map = new HashMap<>(); //新建HashMap map.put(1,1); //添加数据--->进入此方法 }} public V put(K key, V value) { return putVal(hash(key), key, value, false, true); //继续进入方法 }final V putVal(int hash, K key, V value, boolean onlyIfAbsent, boolean evict) { Node[] tab; Node p; int n, i; //新建一个节点数组Node[],节点p,整形n,i if ((tab = table) == null || (n = tab.length) == 0) //如果当前HashMap==null或者数组长度==0 n = (tab = resize()).length; //扩容---n是当前容量 if ((p = tab[i = (n - 1) & hash]) == null) //如果根据当前键计算出的索引位置没有元素 tab[i] = newNode(hash, key, value, null); //把当前数据创建的新节点放到这个位置 else { //当前索引位置有元素 Node e; K k; //新建节点e 键类型变量k if (p.hash == hash && //当前键值相等 ((k = p.key) == key || (key != null && key.equals(k)))) e = p; //把新节点p赋值给e else if (p instanceof TreeNode) //否则 就判断p是不是树节点 是树节点调用树的put e = ((TreeNode)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 //如果节点数>=边界值-1 treeifyBin(tab, hash); //此时将链表转为红黑树 break; } if (e.hash == hash && //判断在循环节点过程中如果有键值相等就结束循环-此时e存的是 ((k = e.key) == key || (key != null && key.equals(k)))) break; p = e; //此时p或许是新节点并且被当前链表尾节点指向了 或许是p的节点的key与新节点的key相等了 } } if (e != null) { // existing mapping for key V oldValue = e.value; //把旧值返回 if (!onlyIfAbsent || oldValue == null) e.value = value; //新值覆盖旧值 afterNodeAccess(e); return oldValue; } } ++modCount; //此处++ if (++size > threshold) //此处判断是否达到边界值 是否扩容 resize(); afterNodeInsertion(evict); return null; }

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:2022 最新版 JDK 17 下载与安装 步骤演示 (图示版)
下一篇:Java并发内存模型详情
相关文章

 发表评论

暂时没有评论,来抢沙发吧~