HashMap有两个参数影响其性能:
- table容量
- 加载因子
容量是哈希表中桶的数量,初始容量只是哈希表在创建时的容量。加载因子是哈希表的容量不足时进行扩容的阈值,即达到多满的一种度量。当哈希表中的条目数超出了默认加载因子与哈希表总容量的乘积是,则要对哈希表进行扩容、rehash操作(重建内部数据结构,位置分布),默认是扩容到原容量的2倍。
我对加载因子的理解是:即哈希表中数据的严密紧凑程度
通常确定加载因子值的重要因素就是在时间和空间的成本上寻求一种折中。
- 加载因子过高,例如为1,虽然减少了内存你的开销,提高了内存的使用效率,但是同时也增加了hash碰撞的产生几率,导致链表变长,查询效率降低。
- 加载因子过低,例如0.25,哈希表扩容机制和rehash操作次数的触发频率提高,但元素的位置再哈希表中分布的较为稀疏,减少的查询时间的成本,但是空间利用率很低,每次rehash操作带来的性能损耗会增多。
在设置初始容量时应该考虑到哈希表中所需的条目数及其加载因子,以便最大限度的减少rehash操作和提高查询效率。所以,一般在使用HashMap时建议根据预估值设置初始容量,减少扩容操作。
- 默认加载因子值:0.75
- 默认初始容量:16
- 默认扩容倍数:2
例如加载因子为0.5,初始容量为50,则在存入HashMap中的元素个数达到25个时,进行扩容操作,扩容到100容量,其中元素重新均匀分布。结果就是25个元素更加均匀分布在[0,99]的下标中。