HashMap(JDK1.8)源码+底层数据结构分析

学习来自:
https://github.com/Snailclimb/JavaGuide/blob/master/docs/java/collection/HashMap(JDK1.8)源码+底层数据结构
https://blog.csdn.net/weixin_42373997/article/details/112085344分析.md

HashMap 简介

HashMap(JDK1.8)源码+底层数据结构分析

底层数据结构分析

HashMap(JDK1.8)源码+底层数据结构分析
HashMap(JDK1.8)源码+底层数据结构分析

JDK1.8 之后

HashMap(JDK1.8)源码+底层数据结构分析

类的属性

public class HashMap<K,V> extends AbstractMap<K,V> implements Map<K,V>, Cloneable, Serializable {
    // 序列号
    private static final long serialVersionUID = 362498820763181265L;
    // 默认的初始容量是16
    static final int DEFAULT_INITIAL_CAPACITY = 1 << 4;
    // 最大容量
    static final int MAXIMUM_CAPACITY = 1 << 30;
    // 默认的填充因子
    static final float DEFAULT_LOAD_FACTOR = 0.75f;
    // 当桶(bucket)上的结点数大于这个值时会转成红黑树
    static final int TREEIFY_THRESHOLD = 8;
    // 当桶(bucket)上的结点数小于这个值时树转链表
    static final int UNTREEIFY_THRESHOLD = 6;
    // 桶中结构转化为红黑树对应的table的最小大小
    static final int MIN_TREEIFY_CAPACITY = 64;
    // 存储元素的数组,总是2的幂次倍
    transient Node<k,v>[] table;
    // 存放具体元素的集
    transient Set<map.entry<k,v>> entrySet;
    // 存放元素的个数,注意这个不等于数组的长度。
    transient int size;
    // 每次扩容和更改map结构的计数器
    transient int modCount;
    // 临界值 当实际大小(容量*填充因子)超过临界值时,会进行扩容
    int threshold;
    // 加载因子
    final float loadFactor;
}

HashMap(JDK1.8)源码+底层数据结构分析

HashMap 源码分析

HashMap(JDK1.8)源码+底层数据结构分析

put 方法

HashMap(JDK1.8)源码+底层数据结构分析
HashMap(JDK1.8)源码+底层数据结构分析
HashMap(JDK1.8)源码+底层数据结构分析

对比1.7 put

HashMap(JDK1.8)源码+底层数据结构分析
简单总结:
1.7使用的是头插法 1.8后使用的是尾插法
头插法会导致可能出现环的问题
HashMap(JDK1.8)源码+底层数据结构分析

链表,红黑树互相转换阈值

链表转红黑树阈值是 8,红黑树转链表阈值小于等于6时

HashMap(JDK1.8)源码+底层数据结构分析

上一篇:水域大小


下一篇:Docker Desktop 收费之后,神网友弄了个替代方案