欢迎光临散文网 会员登陆 & 注册

千锋教育Java入门全套视频教程(java核心技术,适合java零基础,Java

2023-07-22 09:11 作者:reaonable  | 我要投稿

HashMap-put的过程与原理

从扩容的角度来看,当一个哈希表中的元素数量增加到一定程度时,就需要进行扩容。哈希表的扩容是为了保持其较低的装载因子(load factor),从而保证哈希表的查询、插入和删除操作的性能在一个较好的范围内。

装载因子(Load Factor)定义为:哈希表中已有元素的数量(n)与哈希表的大小(m)的比值,即装载因子 = n / m。当装载因子较低时,哈希表的空间利用率较低,当装载因子较高时,哈希表的碰撞冲突会增多,影响性能。

带参和无参的区别:

  • 带参:在进行哈希表扩容时,需要传入一个新的哈希表大小(通常是当前大小的两倍)。这个参数指定了新的哈希表容量,它可以是一个固定的值,也可以根据某种策略动态计算。带参的扩容可以灵活地控制哈希表的大小,但是在扩容过程中可能需要重新计算哈希值和重新分配内存,有一定的计算成本。
  • 无参:在进行哈希表扩容时,不需要显式指定新的哈希表大小,而是根据一定的规则或策略动态地计算扩容后的大小。无参的扩容通常是根据装载因子的阈值来触发的,当装载因子超过一定的阈值时,系统自动进行扩容。无参扩容省去了显式参数传递的麻烦,但是可能在某些情况下不能很好地控制哈希表的大小。

何时变化为红黑树:

哈希表在处理哈希碰撞(两个不同的键值映射到相同的哈希桶)时,可以采用链表或者红黑树来解决。通常,哈希表中每个哈希桶都是一个链表,当链表中元素过多时,链表的查询、插入和删除操作效率会降低。

为了解决链表过长导致的性能问题,一些哈希表实现采用了“链表长度阈值”(Threshold)的概念。当链表长度超过一定的阈值时,将链表转换为红黑树,从而提高查询、插入和删除操作的效率。红黑树作为一种自平衡二叉搜索树,具有较好的查找性能。

总结:

哈希表扩容通常在装载因子较高时进行,可以是带参扩容或无参扩容。带参扩容需要显式指定新的哈希表大小,而无参扩容根据装载因子阈值自动触发。同时,哈希表中的链表可能会在链表长度过长时转换为红黑树,以提高性能。不同的哈希表实现可能采用不同的策略来处理扩容和碰撞问题。

千锋教育Java入门全套视频教程(java核心技术,适合java零基础,Java的评论 (共 条)

分享到微博请遵守国家法律