为了账号安全,请及时绑定邮箱和手机立即绑定

08HashMap

标签:
Java

1整体架构

 HashMap底层的数据结构主要是:数组+链表+红黑树。其中当链表的长度大于等于八时,链表会转化为红黑树,当红黑树的大小小于等于6时,红黑树会转化成链表。

1.1类注释

从HashMap的类注释中,我们可以得到如下信息:

  • 允许nll值,不同于HashTable,是线程不安全的;

  • 影响因子默认值是0.75,不扩容的条件:数组容量>需要数组大小/影响因子

  • 如果有很多数据需要储存到 HashMap 中,建议 HashMap 的容量一开始就设置成足够的大小,这样可以防止在其过程中不断的扩容,影响性能;

  • HashMap 是非线程安全的,我们可以自己在外部加锁,或者通过 Collections#synchronizedMap 来实现线程安全,Collections#synchronizedMap 的实现是在每个方法上加上了 synchronized 锁;

  • 在迭代过程中,如果 HashMap 的结构被修改,会快速失败。

2新增

新增key、value大概的步骤如下:

  1. 空数组有无初始化,没有的话初始化;

  2. 如果通过 key 的 hash 能够直接找到值,跳转到 6,否则到 3;

  3. 如果 hash 冲突,两种解决方案:链表 or 红黑树

  4. 如果是链表,递归循环,把新元素追加到队尾;

  5. 如果是红黑树,调用红黑树新增的方法;

  6. 通过 2、4、5 将新元素追加成功,再根据 onlyIfAbsent 判断是否需要覆盖;

  7. 判断是否需要扩容,需要扩容进行扩容,结束。

链表查询的时间复杂度是O(n),红黑树的查询的复杂度是O(log(n))。在链表数据不多的时候,使用链表进行遍历也比较快,只有当链表数据比较多的时候,才会转化为红黑树,但红黑树需要占用空间是链表的2倍。


点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消