浅谈hashmap

Hashmap组成
Hashmap大概由两部分组成,第一部分是:数组;第二部分是:链表或者红黑树(在jdk1.8以后当一支链表的长度超过8以后,链表要转化为红黑树),emmm大概长成这样子:
在这里插入图片描述
如何构建一个Hashmap?

  1. 构建一个Hashmap我们得先确定一个散列函数(下图菱形中的X%6就是一个简单地散列函数[自己定义不唯一])
  2. 然后让数据根据散列函数运算得到对应的散列值,找到它在数组中对应的位置
  3. 将数据放入数组对应的链表/红黑树中(放在红黑树的头部比较方便)
  4. 散列碰撞:如下图圈出来的情况—>不同的值经过散列函数后进入了同一个链表中的现象
  5. 重(chong)Hash:我们确定每个链表/红黑树中的数据量是相同的(比如30个),当一棵树中的数据超过30时,将数组的size翻倍,然后打乱所有的数据,重新根据散列函数分配数据
  6. 数据倾斜:当散列过程中,大量的数据都被配往一棵后者几棵树中,这种数据分配不平衡的现象较数据倾斜(所以散列函数要搞的复杂一点,尽量能使数据发散的分配到所有的树中)
    在这里插入图片描述时间复杂度
    因为数组的长度和链表的长度是一个常数,在插入/查找数据时所进行的步骤都为小于这个最大的常数,所以Hashmap的查找和插入的是将复杂度都为O(1)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值