Java的HashMap如何合理地初始化

Java的HashMap是如何实现的:

HashMap<String, Integer> mapJdK = new HashMap<String, Integer>();

上述代码在原则上是合法的java代码,但是这个HashMap并没有合理地初始化。

在这种情况下,Java的实现中需要将桶的数目重置为HashMap中数据的持续增加的数目。在Java中加载因子(load factor)的默认值为0.75,hash map的默认初始容量是16。这意味着下一次重置大小的阀值为:

DEFAULT_INITIAL_CAPACITY = 16; 
DEFAULT_LOAD_FACTOR = 0.75; 
THRESHOLD = DEFAULT_INITIAL_CAPACITY * DEFAULT_LOAD_FACTOR;

当hash map的数据量超出了阀值THRESHOLD的时候,这个hash map会自动将该hash map重构成为一个具有更大容量的新数组。每一个重置大小都将导致一次容量加倍:16*0.75, 32*0.75, 64*0.75……如下图所示:

将初始容量设置到一个很高的值不能解决问题,因为一次基于集合的迭代需要和hash map成比例的容量。所以如果你要对你的数值进行多次迭代,将初始容量设置得很高不是很重要。

如何用合理的数值初始化Java的Hash Map呢?


最小的初始容量应该是 (数据条数)/0.75 + 1。

int capacity = (int) ((expected_maximal_number_of_data)/0.75+1);
HashMap<String, Integer> mapJdK = new HashMap<String, Integer>(capacity);

对于小的hash map,其实没有多大影响,但是对于很大的hash map(比如100MB)的情况下,这将很大程度地增加所需要的内容,而且重置Hash将造成应用运行速度的下降。


原po:http://www.sw-engineering-candies.com/blog-1/howtoinitializeajavahashmapwithreasonablevalues

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值