HashMap初始容量

简介: 在已知HashMap中将要存放的KV个数的时候,设置一个合理的初始化容量可以有效的提高性能。

在已知HashMap中将要存放的KV个数的时候,设置一个合理的初始化容量可以有效的提高性能。

HashMap默认初始容量:16 (即2<<3)

别问为什么,太大浪费内存,太小频繁扩容,16是一个在性能和资源之间相对折中的选择;

我们可以在new HashMap时显式指定容量大小

HashMap<String, Object> map = new HashMap<>(expectedSize );

但是!!

但是!!

但是!!

事情没你想得那么简单


你指定容量大小后,实际初始容量大小并不一定是你指定的容量大小,因为HashMap的发明者认为实际需要的容量大小往往大于你在new HashMap时预估的大小expectedSize ,所以HashMap底层会对你指定的expectedSize 进行处理,处理后的expectedSize 才是实际容量大小;


底层容量处理


Hash会选择第一个大于等于你传入expectedSize 的第一个2的幂作为容量

ae941dc8d3854b6a8449de6883a50799.png

比如


new HashMap<>(3),那么实际初始容量大小为4;

new HashMap<>(4),那么实际初始容量大小为4;

new HashMap<>(5),那么实际初始容量大小为8;

new HashMap<>(7),那么实际初始容量大小为8;

new HashMap<>(10),那么实际初始容量大小为16;

new HashMap<>(16),那么实际初始容量大小为16;

new HashMap<>(23),那么实际初始容量大小为32;


这里多举一些例,方便大家理解

相关文章
|
5月前
|
算法 Java 开发者
为啥HashMap的默认容量是16?
为啥HashMap的默认容量是16?
52 0
|
6天前
|
机器学习/深度学习 C# 索引
HashMap的容量为什么一定是2^n?
`HashMap` 的容量设计为 `2^n` 主要出于三个考虑:1) 位运算效率高,通过 `(hash & (capacity - 1))` 快速计算索引;2) 元素分布均匀,减少哈希冲突,提高性能;3) 扩容时只需检查最高位,简化重分布过程,提升扩容效率。初始容量为 `1 &lt;&lt; 4`(16),扩容以2倍递增。
HashMap的容量为什么一定是2^n?
|
5月前
|
Java
Java为什么建议初始化HashMap的容量大小?
【5月更文挑战第3天】Java中初始化HashMap容量能提升性能。默认容量16,扩容按当前的1/2进行。预估元素数量设定合适容量可避免频繁扩容,减少性能损耗。过大浪费内存,过小频繁扩容,需权衡。Java 8后扩容策略调整,但核心仍是预估初始容量以优化性能。
67 1
|
Java 索引
蚂蚁金服Java研发岗二面:说说HashMap 中的容量与扩容实现
JDK1.8 中 HashMap 的底层实现,我相信大家都能说上来个 一二,底层数据结构 数组 + 链表(或红黑树) ,源码如下
|
5月前
|
Web App开发 存储 数据可视化
VisualVM【实践 01】工具VisualVM下载使用及插件Visual GC示例说明HashMap初始化容量initialCapacity的影响(源码及visualvm_215.zip分享)
VisualVM【实践 01】工具VisualVM下载使用及插件Visual GC示例说明HashMap初始化容量initialCapacity的影响(源码及visualvm_215.zip分享)
85 0
|
11月前
|
存储 缓存 Java
Java中使用HashMap时指定初始化容量性能一定会更好吗?
可以看出,容量16是个分水岭,当容量为16时,二者几乎没啥差异,这也很容易理解,当不指定容量时默认初始容量就是16。但容量大于16时,指定容量时的性能会高于不指定时的性能,随着数量的增加,前者会比后者性能高出50%。但当数据量小于16时,不指定容量大小反而性能更高,最多甚至相差2倍,这就和我们之前的认知不一样了。
82 0
|
Java 索引
81. 说说HashMap 中的容量与扩容实现
81. 说说HashMap 中的容量与扩容实现
78 0
81. 说说HashMap 中的容量与扩容实现
|
消息中间件 Java Kafka
【从Java面试题看源码】-HashMap 初始容量 计算方法
【从Java面试题看源码】-HashMap 初始容量 计算方法
【从Java面试题看源码】-HashMap 初始容量 计算方法
HashMap 使用的时候指定容量?你真的用明白了吗?(值得一阅)
HashMap 使用的时候指定容量?你真的用明白了吗?(值得一阅)
287 0
HashMap 使用的时候指定容量?你真的用明白了吗?(值得一阅)
|
消息中间件 Java Kafka
【面试题看源码】-HashMap 初始容量 计算方法
【面试题看源码】-HashMap 初始容量 计算方法
【面试题看源码】-HashMap 初始容量 计算方法