面经-HashMap

哈希表

应用场景:快速查找

通过计算元素的哈希码,得到元素的桶下标,计算元素位置。接下来只需要进行少量的比较即可找到元素。

当链表长度过长时,可以通过扩容减少链表长度。但如果元素的原始哈希码都一样时,即使扩容也无法改变链表长度,只能进行红黑树的树化。

底层数据结构,1.7与1.8有何不同?

1.7 数组+链表

1.8 数组+(链表|红黑树)

为什么要用红黑树?

红黑树:父节点左边都是比它小的元素;父节点右边都是比它大的元素。

数组链表过长会影响HashMap的性能。引入红黑树后链表过长也不会影响性能。

何时会树化?

1.链表长度大于8.

2.数组容量大于等于64.如果不够大会首先尝试扩容。

为何一上来不树化?

链表短时性能比红黑树好。树化会占用更多内存,没必要进行树化。

树化阈值为何是8?

正常情况下链表不会超过8.遭受到恶意攻击后链表长度才会过长。

1.红黑树用来避免Dos攻击,防止链表过长时性能下降,是偶然现象。hash表时间复杂度为O(1),且Node占用空间小;而红黑树时间复杂度为O(log₂n),且TreeNode占用空间较大。非必要时尽量使用链表。

2.hash值完全随机时,在hash表内按泊松分布。在负载因子为0.75的情况下,长度超过8的链表出现的概率为亿分之6.选择8使树化的几率足够小。

何时会退化为链表?

1.扩容时拆分树,树元素<=6时退化链表。

2.remove树节点,若root(根节点)、root.left(左孩子)、root.right(右孩子)、root.left.left(左孙子)有一个为null,也会退化链表。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值