Java 中, HashMap 扩容可以避免吗?

2019-07-24 06:19:29 +08:00
 lixyz

有一道面试题:

HashMap 是如何扩容的,如何避免扩容?

扩容的话,是扩容到大于初始容量的第一个 2 次方

但是这个扩容操作可以避免吗?莫非是初始化的时候就定义足够大容量的?

google 搜了一圈没有答案,求大神分析

6581 次点击
所在节点    Java
34 条回复
xuanbg
2019-07-24 09:58:29 +08:00
@LuGew 这个数组就小多了呀,不但元素少,数据量也小,复制的性能问题可以忽略
xuanbg
2019-07-24 10:07:50 +08:00
@wwqgtxx 性能基本不会影响太多,按下标读的话,只不过是直接寻址变成可计算的两级寻址,寻址的时间复杂度还是 O(1)。通过 Key 读的话,一样是通过哈希寻址,并没有什么区别。
joooooker21
2019-07-24 10:17:36 +08:00
习惯的做法是提前确定并设置容量
zhybb2010
2019-07-24 10:26:05 +08:00
指定大小。
ykrank
2019-07-24 11:03:04 +08:00
@xuanbg Show me code. 这种研究透了的基础数据,要性能优化,得给出你的代码了
Alex5467
2019-07-24 11:07:13 +08:00
我想你大概是理解错了,避免扩容是避免不必要的扩容,比如你要存 64 个数据,初始化 map 的时候他只有 16 的初始容量,16*0.75 相当于只有 12 的容量,这个时候超过了初始容量,map 底层就得扩容了,所以在你知道要保存的数据大概数量的话最好的是给他设置初始容量值,这样的话超过 16 后他就不会自动扩容了,也就是避免扩容,面试官问的应该没问题
Alex5467
2019-07-24 11:11:02 +08:00
扩容是不可避免的,最开始的桶能装 1 升水,现在你差不多知道有十升水,你就会设置大一点的桶来装水,如果不设置的话会一直扩容,这样的性能是很差的
hoorace
2019-07-24 11:14:51 +08:00
这个题目重点考察的是 hashmap 的内存管理,如果是容量不够的情况下是如何申请内存的。
http://coding-geek.com/how-does-a-hashmap-work-in-java/
Google 搜索关键词:hashmap memory allocation
oaix
2019-07-24 12:04:34 +08:00
@xuanbg #22 resize 不仅仅是加一块地址。所有的已有元素都需要重新哈希一遍。
lihongjie0209
2019-07-24 12:41:00 +08:00
initCapacity = Integer.Max_Value
Raymon111111
2019-07-24 14:45:33 +08:00
预设一个大小

但是不要过度优化

几百个元素这种就没有必要考虑这种问题
aqqwiyth
2019-07-24 17:06:47 +08:00
还要追究这点性能么.....
wysnylc
2019-07-24 17:21:48 +08:00
@skypyb #6 +1
Alex5467
2019-07-24 17:30:31 +08:00
@wysnylc 扩容是可以避免的

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/585621

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX