HashMap之装载因子
装载因子: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之装载因子的更多相关文章
- 从头认识java-15.7 Map(6)-介绍HashMap的工作原理-装载因子与性能
这一章节我们通过讨论装载因子与性能,再来介绍HashMap的工作原理. 1.什么是装载因子?他有什么作用? 以下的代码就是装载因子 /** * The load factor used when no ...
- 我说我了解集合类,面试官竟然问我为啥HashMap的负载因子不设置成1!?
在Java基础中,集合类是很关键的一块知识点,也是日常开发的时候经常会用到的.比如List.Map这些在代码中也是很常见的. 个人认为,关于HashMap的实现,JDK的工程师其实是做了很多优化的,要 ...
- java基础 - 什么是hashmap的负载因子,hashmap的容量(即桶个数)为什么是2的幂次
HashMap的负载因子是指,比如容量为16,负载因子为0.75,则当HashMap的元素个数达到16*0.75=12时,触发扩容.(16和0.75是初始默认的容量和负载因子). HashMap的容量 ...
- 【Java入门提高篇】Day22 Java容器类详解(五)HashMap源码分析(上)
准备了很长时间,终于理清了思路,鼓起勇气,开始介绍本篇的主角——HashMap.说实话,这家伙能说的内容太多了,要是像前面ArrayList那样翻译一下源码,稍微说说重点,肯定会让很多人摸不着头脑,不 ...
- HashMap 1.8的源码分析一
public class HashMap<K,V> extends AbstractMap<K,V> implements Map<K,V>, Cloneable, ...
- 面试官:"准备用HashMap存1w条数据,构造时传10000还会触发扩容吗?"
// 预计存入 1w 条数据,初始化赋值 10000,避免 resize. HashMap<String,String> map = new HashMap<>(10000) ...
- 面试官:”准备用HashMap存1w条数据,构造时传10000会触发扩容吗?“
通常在初始化 HashMap 时,初始容量都是根据业务来的,而不会是一个固定值,为此我们需要有一个特殊处理的方式,就是将预期的初始容量,再除以 HashMap 的装载因子,默认时就是除以 0.75. ...
- 散列表(hash table)——算法导论(13)
1. 引言 许多应用都需要动态集合结构,它至少需要支持Insert,search和delete字典操作.散列表(hash table)是实现字典操作的一种有效的数据结构. 2. 直接寻址表 在介绍散列 ...
- java-tip-HashMap
HashMap的基本查找过程: 先使用key.hashCode()生成哈希值,根据哈希值来确定key存放的位置 找到key在数组中的位置后,再使用key.equals()方法来找到指定的key. 1. ...
- HashMap与TreeMap源码分析
1. 引言 在红黑树--算法导论(15)中学习了红黑树的原理.本来打算自己来试着实现一下,然而在看了JDK(1.8.0)TreeMap的源码后恍然发现原来它就是利用红黑树实现的(很惭愧学了Ja ...
随机推荐
- 分享一个裁剪图片Chrome 扩展 —— Crop Image
1. 前言 在日常工作和设计过程中,我们常常需要对图片进行裁剪,以适配不同的使用场景.无论是社交媒体头像.网站图片优化,还是艺术设计,精确的图片裁剪都是必不可少的.然而,许多在线工具使用复杂,或者功能 ...
- 【markdown】各种markdown的骚操作
目录 1.给图片居中.加题注 2. 文字添加下划线 3. 文字高亮.自定义高亮的颜色 4. 博客文章生成目录 5. markdown 实现页内跳转 6. 数学公式调大尺寸.右编号 7. 折叠内容 8. ...
- 不上苹果的app store,安装ios应用最简单的方法
不上架appstore,安装app有两种方法,一种是使用企业类型的苹果开发者账号的In house类型的证书和证书profile文件打包,一种是使用个人/公司类型的苹果开发者账号的ad hoc类型的证 ...
- 2025年3月GESP八级真题解析
第一题--上学 题目描述 C 城可以视为由 \(n\) 个结点与 \(m\) 条边组成的无向图.这些结点依次以 \(1,2,-,n\) 标号,边依次以 \(1,2,-,m\) 标号.第 \(i\) 条 ...
- exim4
exim4 一台 debian 机器日常执行 apt update 后发现需要更新如下软件包, 之前没见过, 特此记录下. root@idebian:~# apt list --upgradable ...
- ShadowSql之借Dapper打通ORM最后一公里
ShadowSql专职拼写sql,要想做为ORM就需要借高人之手 我们要借的就是Dapper,Dapper以高性能著称,ShadowSql搭配Dapper就是强强联手 为此本项目内置了一个子项目Dap ...
- nodejs环境准备
这是为了针对nodejs使用来进行的环境准备,分出windows和ubuntu两种情况: Windows 环境 安装 Node.js 下载安装包:访问下面nodejs官网: 选择适合 Windows ...
- unity prefab
1.修改prefab原始资源某组件为enabled或disabled,实例如果起初和原始资源是一样的状态那么修改原始资源会作用到实例上,如果发现不一样那么原始资源的修改不会作用到实例上,而且以后都不会 ...
- 🎀Java线程池创建
简介 Java 手动创建线程池 代码 package com.zk.app.utils; import com.google.common.util.concurrent.ThreadFactoryB ...
- Python requests代理(Proxy)使用教程
Python requests代理(Proxy)使用教程 在 Python 的 requests 库中,使用代理服务器可以让你通过不同的网络路由发送 HTTP 请求.代理服务器可以帮助隐藏真实 IP ...