集合中最常见的问题:hashmap的原理

1、hashmap的结构是什么?

当然是key-value的形式,key是用数组来保存,那value则是在1.7和1.8是不一样的,1.7是链表。1.8则是长度在8个以内则是链表,长度超过8个则是红黑树。

2、key数组保存,怎么利用hash快速查询到相应的key,使得查询时间复杂度是O(1)?

这是由于key的hash和数组的位置之间存在转换关系:index=hash(key)% length,所以map的长度必须为2的幂树

3、为什么1.8是8个以内是链表呢?

这是由于链表的长度是符合泊松分布,当长度等于8时,出现的概率为千万分之一,所以正常情况下map不会出出现转换成树的情况。

4、为什么要用链表?

这是由于链表的好处是插入和删除,而查询需要全遍历。但是由于链表长度一般都不会很长,所以1.7直接用的链表。

5、1.8为什么要用红黑树呢?

为了获取高的查询效率,类似于mysql一样,当数据量很大的情况下,需要加索引,而索引的数据结构则是红黑树。但是有得就有失。我们在获取查询效率的同时,需要付出插入和删除难度和复杂度的代价。而为什么使用红黑树,为什么不使用其他树?这是由于红黑树是特殊的二叉平衡树。它比平衡二叉树更高的插入和删除效率。

总结:

map使用的过程中虽然不需要考虑很多细节,但是按照实际生产过程中,可以根据实际场景初始化map的大小,减小map中resize的过程。默认大小是16。还有对于hash的处理,尽量减少出现相同hash的key出现。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值