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)

  • 相关阅读:
    redis-trib.rb命令详解
    Azure 网站上的 Java
    好消息
    Microsoft Azure 上的自定义数据和 Cloud-Init
    关于虚拟机的博客
    cocos2dx CCControlSlider
    cocos2dx CCControlSwitch
    cocos2dx CCEditBox
    cocos2dx CCTextFieldTTF
    cocos2dx 字体BMFont,Atlas
  • 原文地址:https://www.cnblogs.com/loren-Yang/p/7466113.html
Copyright © 2011-2022 走看看