zoukankan      html  css  js  c++  java
  • HashMap和ConcurrentHashMap流程图

    本文表达HashMap和ConcurrentHashMap中的put()方法的执行流程图,基于JDK1.8的源码执行过程。

    HashMap的put()方法:
    这里写图片描述

    ConcurrentHashMap的put()方法:
    final V putVal(K key, V value, boolean onlyIfAbsent) {….}
    1.key或value是否为空,是的话,抛异常new NullPointerException();
    2.table是否为空或length==0;是的话,初始化table;
    3.根据key算出的hash值,从table中拿出table[hash]值,为空则添加,否者判断此值的hash值,如果table[hash].hash==-1,说明此时有线程扩容此链表,你需要去帮忙扩容。
    4.table[hash].hash>=0,锁住table[hash],表示锁住此索引的所有链表或红黑树。判断是key是否重复,重复的话就更新value,判断是不是红黑树,是的话树插入,否者链表尾插入法,更新。

    5.最后,插入后判断链表的节点数是否大于8,是的话,转换为红黑树,
    6.最后判断concurrentHashMap容量,大于扩容值,就进行扩容。

    HashMap的put()和resize()都是尾插节点;(JDK1.8)
    ConcurrentHashMap的put()是尾插节点,tansfer()是头插节点;(JDK1.8)

  • 相关阅读:
    找水王
    第十四周学习记录
    第十三周学习记录
    第十二周学习记录
    序列化
    哪个元素出发事件
    阻止默认行为-event.preventDefault();
    阻止时间冒泡 -event.stopPropagation();
    HTML5的LocalStorage和sessionStorage的使用 -缓存
    同步加载、异步加载、延迟加载
  • 原文地址:https://www.cnblogs.com/loren-Yang/p/7466113.html
Copyright © 2011-2022 走看看