关于hashmap的源码分析

hashmap

一.底层分析

  1. 1首先我们应该创建hashmap对象
    2在第一次添加时,将table设置为Node类型的数组,初始长度为16,并将临界值计算为12(160.75)
    3根据key值就算出一个hash值,在根据hash值去计算出当前数组索引范围内的索引值,
    4.判断当前索引值是否有值如果没有,则直接添加(将值(Node)直接添加到当前索引位置)如果有值,继续判断hash值是否一致hash值不一致,则将当前数据添加到原来数据的next中hash值一致,继续判断内容是否一致,
    如果一致则进行覆盖如果不一致继续将当前数据添加到原来数据的next中
    5 在添加的数据超过临界值时,会自动扩容,扩容规则是原容量的两倍,并且扩容后,内部的数据会重新计算索引值

二. 源码追踪

a. 创建HashMap对象 将负载因子设置为 0.75

  public HashMap() {
        this.loadFactor = DEFAULT_LOAD_FACTOR; 
    }
static final float DEFAULT_LOAD_FACTOR = 0.75f;

b. 在第一次添加时,将table设置为Node类型的数组,初始长度为16,并将临界值计算为12(160.75)

newCap = DEFAULT_INITIAL_CAPACITY;//16
newThr = (int)(DEFAULT_LOAD_FACTOR  DEFAULT_INITIAL_CAPACITY);//0.7516

c. 在添加的数据超过临界值时,先添加,在去扩容

 if (++size > threshold) 判断是否需要扩容
	扩容规则是原容量的两倍
	newCap = oldCap << 1
	newThr = oldThr << 1

三 注意事项

扩容之后,内部的数据会重新计算索引值
1.8之前 HashMap底层是 Node[]+单向链表去实现的 (如果数据量比较大,单向链表有可能数据会比较多,查询效率会较低)
1.8 HashMap底层是 Node[]+单向链表+红黑树去实现的 单向链表的长度超过8,当前这个链表结构就会变为红黑树结构

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值