hashMap底层数据结构 ,负载因子,扩容倍数
时间: 2023-07-21 13:10:39 浏览: 137
HashMap的底层数据结构是数组和链表(或者红黑树,后面会详细说明)的组合,称为哈希表。数组用于存储元素,链表或红黑树用于解决哈希冲突。
负载因子(load factor)是指当前哈希表中已存储元素的数量与数组长度的比值。负载因子越大,表示哈希表中的元素越多,空间利用率也就越高。但是负载因子过大会导致哈希冲突的概率增加,影响查询和插入的性能。负载因子过小则会浪费空间。
在Java中,默认负载因子是0.75,即当哈希表中元素数量达到总容量的75%时,就会触发扩容操作。
扩容倍数(resize factor)是指哈希表在扩容时,将当前容量乘以扩容因子得到的新容量。在Java的HashMap中,默认的扩容倍数是2,即容量翻倍。
当哈希表需要扩容时,它会创建一个新的数组,并将所有元素重新计算哈希值后插入到新数组中。这个过程比较耗时,但可以提高哈希表的性能,因为新的数组长度增大了,减少了哈希冲突的概率。同时,根据链表的长度,当链表长度超过8时,链表会转换为红黑树,以提高查询性能。
总结起来,HashMap的底层数据结构是数组和链表(或红黑树)的组合,负载因子是当前元素数量与数组长度的比值,负载因子过大会增加哈希冲突的概率,负载因子过小会浪费空间。扩容倍数是在扩容时将当前容量乘以扩容因子得到的新容量,通过扩容可以提高哈希表的性能。
相关问题
hashmap hashset的扩容数量
Hashmap和Hashset的扩容数量是由其负载因子和其当前容量共同决定的。
默认情况下,Hashmap的负载因子为0.75,当其大小达到容量的0.75倍时,就会触发扩容操作,扩容后容量会以2的倍数增加。例如,当Hashmap大小为12时(容量为16),再添加9个元素时(总元素数量为21),就会触发扩容操作,容量会增加至32。
同样的,Hashset也有类似的规则。默认情况下,Hashset的负载因子也是0.75,当其大小达到容量的0.75倍时,就会触发扩容操作,扩容后容量会以2的倍数增加。
需要注意的是,无论是Hashmap还是Hashset,扩容操作都是相对耗时的操作,因此在使用时需要留意其负载因子和初始容量,避免过度扩容造成性能问题。
hashmap为什么扩容为原来的二倍
HashMap 扩容为原来的两倍是为了平衡哈希表的负载因子(load factor)和哈希表的容量(capacity)之间的关系。
哈希表的负载因子是指哈希表中存储元素的数量与哈希表容量的比值,当负载因子过高时,哈希表中的碰撞(collision)就会增多,导致哈希表的性能下降。因此,为了保持哈希表的性能,需要在负载因子达到一定阈值时对哈希表进行扩容。
将哈希表的容量扩大一倍,可以减少哈希冲突的概率,提高哈希表的性能。同时,哈希表的扩容也需要消耗一定的时间和空间资源,因此将扩容倍数设置为二倍,可以尽可能减少扩容的次数,提高哈希表的效率。
阅读全文