面试官:HashMap加载因子为什么是0.75?小伙子当场懵了

本文深入探讨HashMap的加载因子,解析其在哈希表中的作用,以及如何平衡数据密度与性能的关系,提供合理的设置建议。

HashMap的确有很多细节值得我们注意,正如被问到HashMap加载因子为什么是0.75?,好了废话不多说,直接上源码分享。

HashMap加载因子是什么?

static final int hash(Object key) {
    int h;
    return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
}
// AbstractMap
public int hashCode() {
     int h = 0;
     Iterator<Entry<K,V>> i = entrySet().iterator();
     while (i.hasNext())
         h += i.next().hashCode();

     return h;
}

HashMap的底层结构是哈希表 ,是以键值对形式存储的。在存HashMap储过程中,首先会通过hash计算出哈希值才能知道数据要存储在哈希表中的某个位置。

但是这样的存储有个问题:

  • 在存在数据时,我们是通过哈希算法计算出要存储的位置,但是有可能该位置已经有数据存储了,这时候就会产生哈希冲突的问题。
  • 还有一个问题就是,如果为了避免哈希冲突,而增大数组容量来减少哈希冲突问题,有可能会导致数组空间浪费或者空间小的问题。

而加载因子就是决定HashMap的数据密度

公式:加载因子=填入表中元素/散列表的长度

如果负载因子设置过大或过小会有什么问题?

  • 首先知道负载因子的大小是主要就是决定了HashMap的数据密度的嘛

  • 如果负载因子越大数据密度越大,就会可能发生碰撞的几率越高,数组中的链表也会越容易长, 这样的话造成查询和插入时的比较次数增多,性能会下降。(可能又引出一个面试题:如何解决Hash碰撞问题?)

  • 如果负载因子越小,就会越容易触发扩容,虽然数据密度也越小,发生碰撞几率小,数组中链表越短对于查询和插入时比较次数也会少一些,性能也会提高。

    但是扩容会影响性能,所以建议初始化预设给它大一点空间。

那你觉得负载因子设置为多少较为合理

HashMap 初始容量大小默认是16,这是为了减少冲突发生的概率,当HashMap的数组长度到达一个临界值的时候,就会触发扩容,把所有元素rehash之后再放在扩容后的容器中,这是一个相当耗时的操作,所以扩容是件影响性能的。

而这个临界值就是由加载因子和当前容器的容量大小来确定的
公式:
临界值:默认容量大小16*加载因子,即默认是16乘0.75=12此时就会发生扩容操作

我会考虑将负载因子设置为0.7~0.75,因为此时平均检索长度接近于常数了,这样会更好一些。
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值