使用HashMap时为什么需要设置初始化大小
HashMap有扩容机制,就是当达到扩容条件时会进行扩容。HashMap的扩容条件就是当HashMap中的元素个数(size)超过临界值(threshold)时就会自动扩容。在HashMap中,threshold = loadFactor * capacity。
所以,如果我们没有设置初始容量大小,随着元素的不断增加,HashMap会发生多次扩容,而HashMap中的扩容机制决定了每次扩容都需要重建hash表,是非常影响性能的。
话不多说上代码:
需要循环10000次,同时往map中插入一万条键和值。如果初始化大小为16的话,那么需要扩容6250次,耗时为12毫秒。
相对应的如果一开始就就初始化大小为100000的话,就不需要扩容了,耗时为5毫秒。
public static void main(String[] args) {
Map<Integer, Integer> map = new HashMap<>(16);
long start = System.currentTimeMillis();
for (int i = 0; i < 100000; i++) {
map.put(i, i);
}
System.out.println("指定大小16耗时为:" + (System.currentTimeMillis() - start));
Map<Integer, Integer> map02 = new HashMap<>(100000);
start = System.currentTimeMillis();
for (int i = 0; i < 100000; i++) {
map02.put(i, i);
}
System.out.println("指定大小200耗时为:" + (System.currentTimeMillis() - start));
}
代码执行结果为:
结论:
在编写代码时还是尽量给出初始化值,当然如果不给出初始化值的话,默认的大小为16.