1、HashMap主要成员变量
size 记录了 Map 中 KV 对的个数。
loadFactor 装载印子,用来衡量 HashMap 满的程度。loadFactor 的默认值为 0.75f。
threshold 临界值,当实际 KV 个数超过 threshold 时,HashMap 会将容量扩容(threshold =容量 * 加载因子)。
capacity 容量,如果不指定,默认容量是 16。
2、HashMap 的扩容机制
HashMap 的扩容条件就是当 HashMap 中的元素个数(size)超过临界值(threshold)时就会自动扩容,从 16 扩容到 32、64、128……。在 HashMap 中,threshold = loadFactor * capacity。
3、是否设置初始化容量
在已知 HashMap 中将要存放的 KV 个数的时候,设置一个合理的初始化容量可以有效的提高性能,为啥呢?
如果我们没有设置初始容量大小,随着元素的不断增加,HashMap 会发生多次扩容,而HashMap 中的扩容机制决定了每次扩容都需要重建 hash 表,是非常影响性能的。
4、初始值设置多少
我们可以认为,当我们明确知道 HashMap 中元素的个数的时候,把默认容量设置成expectedSize / 0.75F + 1.0F 是一个在性能上相对好的选择,但是,同时也会牺牲些内存。
5、总结
以上的操作是一种用内存换性能的做法,真正使用的时候,要考虑到内存的影响。但是,大多数情况下,我们还是认为内存是一种比较富裕的资源。
其实,有时候就算不设置初始值,也没有那么大的影响,甚至是无法感知这些影响的。
但是,大的性能优化,不就是一个一个的优化细节堆叠出来的吗?