JAVA8 HashMap知识点

本博文不针对源码做逐句解析,网上有很多,此文只针对hashmap较为重要的知识点进行归纳总结;
博客小白,文章为原创,里面一些个人的观点可能不太准确或严谨,若有问题欢迎各路大神批评指正

1. HashMap数据结构

(https://img-blog.csdnimg.cn/20200129132343954.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl8zODc5Mjc5MA==,size_16,color_FFFFFF,t_70)

HashMap是以数据加链表形式的一种数据结构,基础数组大小为16,也就是最初会初始化一个长度为16的数组,
每一个位置一般称之为一个哈希桶,用key值来计算桶的位置(计算key值的hashcode再通过扰动得出具体位置),
如果得出桶的位置一样则形成单链表,java8开始引入红黑树,当单链表长度达到8时,链表转化为红黑树;
而当单链表长度从大于等于8到小于6时,则重新转化为单链表,这种情况一般在扩容时较容易产生;

2. 源码中几个关键属性

static final float DEFAULT_LOAD_FACTOR = 0.75f;
 加载因子:意思是当hashmap存储的键值对个数超过其桶数量的0.75时即扩容;如默认16,存储超过12个键值对时即扩容
static final int TREEIFY_THRESHOLD = 8;
static final int UNTREEIFY_THRESHOLD = 6;
 控制链表和红黑树转化的阈值,需要注意的是链表长度等于8或6时就会发生转换
    /**
     * The smallest table capacity for which bins may be treeified.
     * (Otherwise the table is resized if too many nodes in a bin.)
     * Should be at least 4 * TREEIFY_THRESHOLD to avoid conflicts
     * between resizing and treeification thresholds.
     */
    static final int MIN_TREEIFY_CAPACITY = 64;
从注释中可以看出,该属性为最小转换树时的容量,也就是说当整个hashmap容纳键值对的量小于64时,不会发生转换;
treeBin中有一句代码:
if (tab == null || (n = tab.length) < MIN_TREEIFY_CAPACITY)
            resize();
即当键值对数量小于64时不会将传入的链表转化为树,而是进行扩容操作;
实际上这种情况基本不可能产生,因为产
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值