装载因子:load fator,散列表中关键字个数和散列表长度之比。她用于度量所有关键字填充哈希表后饱和的程度。

      重哈希:rehash,亦或再散列,当装载因子达到指定阈值时,散列表进行扩容的过程。

由公式可知,装载因子越大,哈希表填满时所容纳的元素越多,空闲位置越少,好处是提高了空间利用率,但是增加了哈希碰撞的风险,降低了哈希表的性能。

对于没有频繁插入和删除的静态数据而言,可以根据数据的特点和分布情况设计出符合这些数据的哈希函数,从而减少哈希碰撞。

但是大部分情况下是动态数据,数据集合是频繁变动的,我们无法预知数据的个数,因此也无法事先申请一个足够大的 Hash表。随着数据加入,填入表中的元素个数增多,装载因子增大,当装载因子达到一定程度时,哈希碰撞便不可接受,因此我们无法根据数据的特征和分布情况设计出符合这些数据的 Hash函数,而是需要动态扩容,重新申请一个更大的 Hash表并将数据重新散列,存储到新的 Hash表中。

如下图中的散列表,当装载因子达到阈值0.8时进行重哈希,使得装载因子变为0.4,并根据哈希函数把原来的数据存储到新的散列表中。

当数据插入到 Hash表时,如果装载因子还未达到指定阈值,那么不需要重哈希,插入数据非常快,但如果装载因子达到了阈值,就需要首先重哈希,此时就会变得很慢。

当数据需要从 Hash表中删除时,如果 Hash表已经经历过重哈希,随着数据的删除,空闲空间会越来越多。当程序对内存空间非常敏感时,可以设置当装载因子小于某个临界值时,启动动态缩容,让内容空间得到充分利用;当程序对内存空间不太敏感时,就不需要进行动态缩容处理。

发散思维,HashMap的装载因子为什么是0.75?经过前面的分析,基本上为什么是0.75的答案也就出来了,这是时间和空间的权衡。答案就在源码上,我们可以看看:

As a general rule, the default load factor (.75) offers a good tradeoff between time and space costs. Higher values decrease the space overhead but increase the lookup cost (reflected in most of the operations of the HashMap class, including get and put). The expected number of entries in the map and its load factor should be taken into account when setting its initial capacity, so as to minimize the number of rehash operations. If the initial capacity is greater than the maximum number of entries divided by the load factor, no rehash operations will ever occur.

大致意思就是说默认负载因子(0.75)在时间与空间成本之间提供了良好的权衡,并且尽量减少了重哈希次数。

Reference

https://cloud.tencent.com/developer/article/1493913

https://baijiahao.baidu.com/s?id=1656137152537394906&wfr=spider&for=pc

数据结构与算法分析(Java语言描述) 第三版

HashMap之装载因子的更多相关文章

  1. 从头认识java-15.7 Map(6)-介绍HashMap的工作原理-装载因子与性能

    这一章节我们通过讨论装载因子与性能,再来介绍HashMap的工作原理. 1.什么是装载因子?他有什么作用? 以下的代码就是装载因子 /** * The load factor used when no ...

  2. 我说我了解集合类,面试官竟然问我为啥HashMap的负载因子不设置成1!?

    在Java基础中,集合类是很关键的一块知识点,也是日常开发的时候经常会用到的.比如List.Map这些在代码中也是很常见的. 个人认为,关于HashMap的实现,JDK的工程师其实是做了很多优化的,要 ...

  3. java基础 - 什么是hashmap的负载因子,hashmap的容量(即桶个数)为什么是2的幂次

    HashMap的负载因子是指,比如容量为16,负载因子为0.75,则当HashMap的元素个数达到16*0.75=12时,触发扩容.(16和0.75是初始默认的容量和负载因子). HashMap的容量 ...

  4. 【Java入门提高篇】Day22 Java容器类详解(五)HashMap源码分析(上)

    准备了很长时间,终于理清了思路,鼓起勇气,开始介绍本篇的主角——HashMap.说实话,这家伙能说的内容太多了,要是像前面ArrayList那样翻译一下源码,稍微说说重点,肯定会让很多人摸不着头脑,不 ...

  5. HashMap 1.8的源码分析一

    public class HashMap<K,V> extends AbstractMap<K,V> implements Map<K,V>, Cloneable, ...

  6. 面试官:"准备用HashMap存1w条数据,构造时传10000还会触发扩容吗?"

    // 预计存入 1w 条数据,初始化赋值 10000,避免 resize. HashMap<String,String> map = new HashMap<>(10000) ...

  7. 面试官:”准备用HashMap存1w条数据,构造时传10000会触发扩容吗?“

    通常在初始化 HashMap 时,初始容量都是根据业务来的,而不会是一个固定值,为此我们需要有一个特殊处理的方式,就是将预期的初始容量,再除以 HashMap 的装载因子,默认时就是除以 0.75. ...

  8. 散列表(hash table)——算法导论(13)

    1. 引言 许多应用都需要动态集合结构,它至少需要支持Insert,search和delete字典操作.散列表(hash table)是实现字典操作的一种有效的数据结构. 2. 直接寻址表 在介绍散列 ...

  9. java-tip-HashMap

    HashMap的基本查找过程: 先使用key.hashCode()生成哈希值,根据哈希值来确定key存放的位置 找到key在数组中的位置后,再使用key.equals()方法来找到指定的key. 1. ...

  10. HashMap与TreeMap源码分析

    1. 引言     在红黑树--算法导论(15)中学习了红黑树的原理.本来打算自己来试着实现一下,然而在看了JDK(1.8.0)TreeMap的源码后恍然发现原来它就是利用红黑树实现的(很惭愧学了Ja ...

随机推荐

  1. 豆包:php如何模拟多客户端访问服务器

    在 PHP 中模拟多客户端访问服务器可以通过以下几种方式实现,具体方法根据需求选择: 方法 1:使用 cURL 多请求(Multi Handle) 通过  curl_multi_*  系列函数实现并发 ...

  2. 李沐动手学深度学习V2-chapter_convolutional-modern

    李沐动手学深度学习V2 文章内容说明 本文主要是自己学习过程中的随手笔记,需要自取 课程参考B站:https://space.bilibili.com/1567748478?spm_id_from=3 ...

  3. 【练习回顾】DS前三次作业

    第一次作业 T2.基本计算器 使用了数组栈--数字栈和符号栈 T5.全排列输出(permutation) 使用了标准写法--字典序算法 void reverse(int left,int right) ...

  4. python正则表达式笔记1

    最近工作中经常用到正则表达式处理数据,慢慢发现了正则表达式的强大功能,尤其在数据处理工作中,记录下来分享给大家. 一. 正则表达式语法介绍 正则表达式(或 RE)指定了一组与之匹配的字符串:模块内的函 ...

  5. Ollama系列05:Ollama API 使用指南

    本文是Ollama系列教程的第5篇,在前面的4篇内容中,给大家分享了如何再本地通过Ollama运行DeepSeek等大模型,演示了chatbox.CherryStudio等UI界面中集成Ollama的 ...

  6. [源码系列:手写spring] IOC第十一节:Aware接口

    内容介绍 Aware简洁 在Spring框架中,Aware接口是一个非常有用的工具,用于实现Bean与Spring容器及其他资源之间的集成.Aware接口是一个标记接口,其中定义了各种Aware子接口 ...

  7. 英语面试-Behavioral Question - first part

    前言 希望我总结的行为面试问题和答案能够给大家帮助. 学习方法:每个问题都有三部分组成. 第一部分是语料积累,这里是根据视频中的内容总结而来: 第二部分是中文描述,这里主要根据我自己的经历结合问题做出 ...

  8. Windows体验-注册表

    打开方式中关闭在应用商店查找关联应用 HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\Explorer NoUseStoreOpenWit ...

  9. web自动化的三大切换

    元素有时在另一个页面里查找元素却报错找不到元素,可能是因为要查找的元素不在原来所在的页面. 一.iframe切换 有些定位元素定位不到,是因为元素在新的iframe页面里,但是driver还停留在原来 ...

  10. 探秘Transformer系列之(29)--- DeepSeek MoE

    探秘Transformer系列之(29)--- DeepSeek MoE 目录 探秘Transformer系列之(29)--- DeepSeek MoE 0x00 概述 0x01 难点 1.1 负载均 ...