HashMap扩容的背景及原理

/**
 * 初始化容量
 * The default initial capacity - MUST be a power of two.
 */
static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // aka 16
/**
 * 负载因子/阈值
 * The load factor used when none specified in constructor
 */
static final float DEFAULT_LOAD_FACTOR = 0.75f;
背景:
    HashMap存储会存在hash冲突(碰撞的情况),通过查看源码可以发现,当一个HashMap被创建时,他的初始化容量大小为16,我们这里称作
hash桶,默认有16个桶,默认负载因子/阈值为0.75,当往map里put数据时会针对key值key.hashCode()的hashcode值进行hash(Object
key) 运算,通过index = hash & (tab.length – 1)方法计算得出数据将要存放目标桶,当存在不同的key值经过hash计算之后得到了同
一个目标桶,则这个桶里将要存储两份数据,在存储上,这个桶里这两份数据会以链表的形式存储,当数据存储过多时,碰撞的几率会增加,单个hash
桶中的链表会变长,当下次通过get方法查询数据时,同样会经过hash得到数据存储的目标桶但是这时这个桶里存放了多条数据以链表的形式存储,
这时候需要从链表里找出我需要的数据则需要遍历链表,链表过长时,查询速度较慢,为了降低hash冲突的出现概率,保证查询的效率,扩容的概念
更值得关注。
HashMap扩容的条件:
   1、HashMap中的数据达到阈值。
   2、出现hash碰撞的情况。
扩容机制:
    由初始化hash桶数量16和阈值0.75为例,当map中的数据达到16*0.75=12时,此时map中的数据已经达到了hashmap扩容机制的阈值,当再
次插入第13个数据时hashmp将自动扩容(前面十二个数据中有出现hash冲突的前提下),扩容的hash桶大小以2的n次方增加,16扩容之后为32。
扩容的缺点:
   在开发过程中,如果hashmap自动扩容后,而我们又不会再往hashmap中put数据,这时扩容的意义可能就没那么大,甚至是无效扩容,所以在开
发时可以自己预估hashmap所需要的容量,通过指定hashmap的初始化容量和阈值来避免无效扩容。
总结:
   HashMap的扩容、人为的设置HashMap容量和阈值限制自动扩容都是在进行时间和空间上的权衡,即内存和效率上的选择,如果希望查询快点,
则降低负载因子,增加HashMap初始容量,降低key值hash碰撞的几率。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值