一、哈希冲突如何解决,链表转红黑树的条件是什么?(腾讯一面)
----什么时链表 什么时红黑树 我的数据结构还在更新中,努力在一个月更完。
HashMap 哈希冲突是通过拉链法来解决的,当有新的键值对要插入到HashMap中时,就会先计算键的哈希值,然后根据哈希值确定在数组中的位置。如果该位置已经有元素了,就会将新的元素插入到该位置的链表尾部(在Java 8及之后的版本中,当链表长度到达一定阈值时就会转换为红黑树)。这样,同一位置上的多个元素就通过链表(或者红黑树)的方式连接起来,从而解决了哈希冲突。
当链表的长度大于等于8时,并且HashMap的容量大于等于64,会将链表转化为红黑树。这是因为当链表长度较长时,查找、插入和删除操作的时间复杂度会退化为On,而红黑树可以将这些操作的时间复杂度控制在O[logn],从而提高了性能。
二、追问 链表和红黑树在其中的性能表现如何?相较于链表,红黑树有哪些优势?
1.当哈希冲突较少,链表长度较短时,链表的插入、删除和查找操作相对简单,空间开销也较小,性能表现好。
2.当哈希冲突严重时,链表长度较长时,链表的查找、插入和删除操作时间复杂度会退化为0n,性能显著下降。此时,红黑树的O[logn]的时间复杂度又是就会凹显出来,能够提供更高效的操作。