本文表达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)