美文网首页
HashMap的负载因子

HashMap的负载因子

作者: 鱼_可 | 来源:发表于2022-07-06 16:15 被阅读0次

一、负载因子的作用

HashMap负载因子,与扩容机制有关;即若当前容器的容量,达到设定最大值,就需要要执行扩容操作

举个例子:当前的容器容量是16,负载因子是0.75;16*0.75=12,也就是说,当容量达到了12的时就会执行扩容操作。

作用很简单,相当于是一个扩容机制的阈值。当超过了这个阈值,就会触发扩容机制。HashMap源码已经为我们默认指定了负载因子是0.75。

截取部分源码,从这里可以看出,系统默认的负载因子值就是0.75,而且我们还可以在构造方法中去指定。下面我们就正式来分析一下为什么是默认的0.75。

二、原因解释

在考虑HashMap时,首先要想到的是HashMap只是一个数据结构,既然是数据结构最主要的就是节省时间和空间。负载因子的作用肯定也是节省时间和空间。为什么节省呢?我们考虑两种极端情况。

1、负载因子是1.0

数据一开始是保存在数组里,当发生了Hash碰撞的时候,就是在这个数据节点上,生出一个链表,当链表长度达到一定长度的时候,就会把链表转化为红黑树。

当负载因子是1.0时,也就意味着,只有当数组的8个值(这个图表示了8个)全部填充了,才会发生扩容。这就带来了很大的问题,因为Hash冲突时避免不了的。

后果:当负载因子是1.0的时候,意味着会出现大量的Hash的冲突,底层的红黑树变得异常复杂。对于查询效率极其不利。这种情况就是牺牲了时间来保证空间的利用率。

因此一句话总结就是负载因子过大,虽然空间利用率上去了,但是时间效率降低了。

2、负载因子是0.5

后果:负载因子是0.5的时候,这也就意味着,当数组中的元素达到了一半就开始扩容,既然填充的元素少了,Hash冲突也会减少,那么底层的链表长度或者是红黑树的高度就会降低。查询效率就会增加。

但是,此时空间利用率就会大大的降低,原本存储1M的数据,现在就意味着需要2M的空间。

总之,就是负载因子太小,虽然时间效率提升了,但是空间利用率降低了。

3、负载因子0.75

时间和空间的权衡,负载因子是0.75的时,空间利用率比较高,而且避免了相当多的Hash冲突,使得底层的链表或者是红黑树的高度比较低,提升了空间效率。

相关文章

  • HashMap以及其子类关键性总结

    HashMap 1.7中的HashMap 负载因子: 给定默认容量为16 负载因子为0.75 Map在使用过程中...

  • HashMap的负载因子为什么是0.75

    HashMap的负载因子是指,达到容器的最大容量*负载因子,容器就扩容。那么负载因子为什么不设置成1呢?这样空间利...

  • JDK1.7 HashMap 底层分析

    HashMap 底层分析 以下基于 JDK1.7 分析。 容量 负载因子 容量的默认大小是 16,负载因子是 0....

  • HashMap负载因子

    概念 HashMap的底层存在着一个名字为table的Entry数组,在实例化HashMap的时候,会输入两个参数...

  • HashMap 的负载因子

    在 Java 基础中,集合类是很关键的一块知识点,也是日常开发的时候经常会用到的。比如 List、Map 这些在代...

  • HashMap的负载因子

    一、负载因子的作用 HashMap负载因子,与扩容机制有关;即若当前容器的容量,达到设定最大值,就需要要执行扩容操...

  • HashMap

    Q: HashMap什么时候会进行扩容?HashMap在初始化时可以给定初始容量和负载因子,默认的初始容量和负载因...

  • HashMap源码

    一、创建HashMap对象 HashMap有两个重要的参数,容量(Capacity)和负载因子(Load fact...

  • Java HashMap 的扩容因子为什么是 0.75

    所谓的加载因子,也叫扩容因子或者负载因子,它是用来进行扩容判断的。 假设加载因子是0.5,HashMap初始化容量...

  • HashMap 核心知识,扰动函数、负载因子、扩容链表拆分

    HashMap核心知识,扰动函数、负载因子、扩容链表拆分 上次预习 简单实现HashMap 扰动函数 的意义 初始...

网友评论

      本文标题:HashMap的负载因子

      本文链接:https://www.haomeiwen.com/subject/pweybrtx.html