Java的HashMap是如何实现的:
上述代码在原则上是合法的java代码,但是这个HashMap并没有合理地初始化。 在这种情况下,Java的实现中需要将桶的数目重置为HashMap中数据的持续增加的数目。在Java中加载因子(load factor)的默认值为0.75,hash map的默认初始容量是16。这意味着下一次重置大小的阀值为:
当hash map的数据量超出了阀值THRESHOLD的时候,这个hash map会自动将该hash map重构成为一个具有更大容量的新数组。每一个重置大小都将导致一次容量加倍:16*0.75, 32*0.75, 64*0.75……如下图所示:
将初始容量设置到一个很高的值不能解决问题,因为一次基于集合的迭代需要和hash map成比例的容量。所以如果你要对你的数值进行多次迭代,将初始容量设置得很高不是很重要。
最小的初始容量应该是 (数据条数)/0.75 + 1。
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