HashMap扩容机制
大家好,又见面了,我是你们的朋友全栈君。
想要了解HashMap的扩容机制你要有这两个问题
- 1.什么时候才需要扩容
- 2.HashMap的扩容是什么
1.什么时候才需要扩容
当HashMap中的元素个数超过数组大小(数组长度)*loadFactor(负载因子)时,就会进行数组扩容,loadFactor的默认值(DEFAULT_LOAD_FACTOR)是0.75,这是一个折中的取值。也就是说,默认情况下,数组大小为16,那么当HashMap中的元素个数超过16×0.75=12(这个值就是阈值或者边界值threshold值)的时候,就把数组的大小扩展为2×16=32,即扩大一倍,然后重新计算每个元素在数组中的位置,而这是一个非常耗性能的操作,所以如果我们已经预知HashMap中元素的个数,那么预知元素的个数能够有效的提高HashMap的性能。
补充:
当HashMap中的其中一个链表的对象个数如果达到了8个,此时如果数组长度没有达到64,那么HashMap会先扩容解决,如果已经达到了64,那么这个链表会变成红黑树,节点类型由Node变成TreeNode类型。当然,如果映射关系被移除后,下次执行resize方法时判断树的节点个数低于6,也会再把树转换为链表。
2.HashMap的扩容是什么
进行扩容,会伴随着一次重新hash分配,并且会遍历hash表中所有的元素,是非常耗时的。在编写程序中,要尽量避免resize。
HashMap在进行扩容时,使用的rehash方式非常巧妙,因为每次扩容都是翻倍,与原来计算的 (n-1)&hash的结果相比,只是多了一个bit位,所以节点要么就在原来的位置,要么就被分配到”原位置+旧容量”这个位置。
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/147910.html原文链接:https://javaforall.cn
相关文章
- 实现AGI,强化学习就够了?Sutton、Silver师徒联手:奖励机制足够实现各种目标
- [android] android消息机制入门详解手机开发
- Linux中的页缓存机制(linux页缓存)
- 内存分段机制详解
- 研究Redis的工作机制(redis的机制)
- 机制Java Redis实现自动过期机制(redisjava过期)
- 失效Redis Java实现的过期失效机制(redisjava过期)
- 机制Redis数据库的回滚机制解析(redis回滚)
- SQL Server锁机制:从性能优化到大数据处理(sqlserver锁机制)
- SQL Server中的加读锁实现机制(sqlserver加读锁)
- Oracle数据库中主键的自动生成机制(oracle主键自己生成)
- Redis过期机制面试题有头有尾到达答案(redis过期机制面试题)
- Redis实现的访问锁机制及应用(Redis访问锁)
- android的消息处理机制(图文+源码分析)—Looper/Handler/Message
- 解析从源码分析常见的基于Array的数据结构动态扩容机制的详解
- java反射机制示例