当前位置:首页 > 科技动态 > 正文

hashmap为什么要扩容

hashmap为什么要扩容

说说HashMap的扩容过程? HashMap的扩容过程是其内部机制中非常关键的一环,主要用于在元素数量超过当前容量阈值时,通过增加数组容量来减少哈希冲突,提高存取效率...

说说HashMap的扩容过程?

HashMap的扩容过程是其内部机制中非常关键的一环,主要用于在元素数量超过当前容量阈值时,通过增加数组容量来减少哈希冲突,提高存取效率。以下是HashMap扩容过程的详细解释:扩容触发条件 HashMap的扩容触发条件是其内部元素个数(size)大于其阈值(threshold)。

HashMap也用到了哈希码的算法,以便快速查找一个键,TreeMap则是对键按序存放,因此它便有一些扩展的方法,比如firstKey(),lastKey()等,你还可以从TreeMap中指定一个范围以取得其子Map。键和值的关联很简单,用pub(Object key,Object value)方法即可将一个键与一个值对象相关联。

答:HashMap使用数组+链表+红黑树(在特定条件下)进行数据存储。存储时,首先计算key的hash值,然后通过hash散列算法与数组的长度进行运算,得出数据存储的具置(索引)。如果该位置已经存在数据,则采用链表或红黑树的形式进行存储。

候选者:我在学习的时候也看过JDK7的HashMap和ConcurrentHashMap,其实还是有很多不一样的地方,比如JDK 7 的HashMap在扩容时是头插法,在JDK8就变成了尾插法,在JDK7 的HashMap还没有引入红黑树….候选者:ConcurrentHashMap 在JDK7 还是使用分段锁的方式来实现,而JDK 8 就又不一样了。

默认初始容量为10,HashMap为16。Java 7前,ArrayList无参构造器在初始化阶段完成,Java 7后改为在add方法中进行,即延迟初始化。如需存大量数据且已知容量,可通过构造器传入初始容量,避免频繁扩容。ArrayList包含构造器、add方法和get方法。

被问懵了:什么是负载因子?为什么是0.75?

HashMap 负载因子 loadFactor 的默认值是 0.75,主要是因为它提供了空间和时间复杂度之间的良好平衡。空间利用率与性能平衡:负载因子太低会导致大量的空桶浪费空间,而负载因子太高会导致大量的碰撞,降低性能。0.75 的负载因子在这两个因素之间取得了良好的平衡。既不会造成过多的空间浪费,也不会因为碰撞过多而影响性能。

面试中常常被问及的“负载因子”是HashMap中的一个关键概念。负载因子,也称作扩容因子和装载因子,是断何时需要进行扩容的标准。默认值通常设定为0.75,表示当HashMap中元素数量达到其容量的75%时,就会触发扩容操作。通过构造函数可以自定义负载因子,但默认值为0.75。

但是这个0.5和负载因子是不一样的,这个0.5我们是指已经有一半的桶被占用了,而HashMap中的负载因子与我们存入的数据总数量相关,并且根据之前对这种数据结构的了解,数据会存在一定概率出现在一个桶中,所以当一半桶都被占用的时候我们实际存储的数据数量是大于0.5n的。

负载因子:默认值为0.75,是空间与时间的“黄金平衡点”。它决定了HashMap的扩容频率和冲突概率。容量:默认初始容量为16,且必须为2的幂次。这是为了保证索引计算的正确性和数据分布的均匀性。如果手动传入非2的幂次容量,HashMap会自动将其转为最接近的更大幂次。

负载因子调整:负载因子是元素数量与桶数量的比率。HashMap默认负载因子为0.75,超过时触发扩容(增加桶数量),重新计算键的哈希值并映射到新桶。扩容虽减少冲突概率,但需权衡开销(重新哈希成本)。

从泊松分布谈起HashMap为什么默认扩容因子是0.75

HashMap默认扩容因子设定为0.75,主要基于时间成本与空间成本的权衡,这一设计通过泊松分布分析优化了哈希冲突概率与操作效率的关系。以下是具体分析: 扩容因子与泊松分布的关联HashMap在理想随机哈希码条件下,桶中节点频率遵循泊松分布,其参数λ=0.5(由扩容因子0.75推导得出)。

负载因子:默认值为0.75,是空间与时间的“黄金平衡点”。它决定了HashMap的扩容频率和冲突概率。容量:默认初始容量为16,且必须为2的幂次。这是为了保证索引计算的正确性和数据分布的均匀性。如果手动传入非2的幂次容量,HashMap会自动将其转为最接近的更大幂次。

这是因为扩容可以分散哈希冲突,减少链表长度,从而避免不必要的红黑树转换。综上所述,HashMap 中链表长度大于 8 才转化为红黑树是基于性能与开销的平衡、概率统计与泊松分布的原理以及实际使用中的考量而确定的。这一机制确保了 HashMap 在大多数情况下都能保持高效的性能。

在哈希值随机且扩容阈值为默认值0.75的情况下,哈希表每个桶的频率遵循 的 泊松分布 。由于扩容时粒度较大,进而导致泊松分布的方差也很大。如果忽略方差的因素,哈希表桶列表长度为 的概率为 。

最新文章