面经----Hashmap

Hashmap

感谢黑马


快速查找
hashmap如何进行快速查找:将原始值按照一定的规律进行编码,从而获得该Key所在得位置(数组得索引值)。在进行查找得时候,将上述过程反着进行就可以快速查找了。
过程:

  1. 通过计算原始hash 二次hash 以及桶下标,获得当前Key值所对应的数组的索引,以便后续快速查找。
  2. 但是,有些Key值会拥有相同得桶下标。因此,将具有相同桶下标得Key值通过链表得方式存在该索引下.
  3. 当链表长度过长时,hashmap得查询性能会下降。如何优化查询性能?
    1)缩小链表长度–>扩容。
    如何扩容
    首先,数组得索引值通过下式取得
Index =hash2(hash1(key))%capacity
Index =hash2(hash1(key))&(capacity-1)
可以看出,数组的容量可以改变key值的索引,因此,扩容是一个解决办法。
**什么时候扩容**  hashmap中得factor就是一个判断是否扩容得参数(默认0.75)。
 if(元素个数>factor*capacity)
    capacity = 2*capacity;
但是当key值的原始hash值都一样时,扩容之后也不会改变链表长度。

2)将链表转换为红黑树–>树化(空间换时间)
红黑树的特性
父节点左侧比他小,右侧比他大。
红黑树Vs链表
红黑树的搜索时间复杂度o(log2(n))
链表的搜索时间复杂度o(n)

红黑树的底层数据结构是treenode
链表的底层数据结构是Node
红黑树的空间复杂度大于链表的空间复杂度
树化的条件
链表长度大于8,且数组容量大于等于64

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值