首页 > 其他 > 详细

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

时间:2021-09-07 15:52:46      阅读:14      评论:0      收藏:0      [点我收藏+]

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

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 源码分析

技术分享图片

put 方法

技术分享图片
技术分享图片
技术分享图片

对比1.7 put

技术分享图片
简单总结:
1.7使用的是头插法 1.8后使用的是尾插法
头插法会导致可能出现环的问题
技术分享图片

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

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

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

原文:https://www.cnblogs.com/0fflineboy/p/15236936.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!