HashMap

HashMap是基于哈希表对Map接口的实现,HashMap具有较快的访问速度,但是遍历顺序是不确定的

HashMap提供所有可选的映射操作,并允许使用null值

HashMap并非线程安全,当存在多个线程同时写入HashMap时,可能会导致数据的不一致

 

HashMap数组部分称为哈希桶,当链表长度大于等于8时,链表数据将以红黑树的形式存储,当长度降到
6的时候转成列表。

1、为什么引入红黑树?
如果jdk是1.8的时候,hashMap是通过数据+链表+红白数实现的;引入原因是链表查询效率比较低 ; 
1.7的集合当多个key如果计算出来的index发生了冲突的时候,会存放到同一个链表中。而同一个链表
当中,如果 做查询时候效率非常低(因为需要从头查询到尾)时间复杂度为O(n).所以JDK1.8就引入了红
黑树。当我们的数组容量大于等于64且列表长度大于8的时候就会将该列表转为红黑树.从而提高多个key
发生index在冲突的情况下形成链表的时候把它变成红白树的形式。
2.hashmap的时间复杂度?
hashmap根据key查询时间复杂度,要看 key是否发生index冲突,如果我们可以存放在hashMap没有发
生index冲突的情况下,那它的时间复杂度就是O1.也就是我只需要查询一次就能找到.如果我们key存放
在hashmap中有index冲突,采用链表进行存放。也就是jdk1.7的hashmap,采用链表集合index冲突的
key那它的时间复杂度就是O(n),也就是从头部查询到尾部. 如果key发生了index冲突采用 红黑树来
存放,那它的时间复杂度就是O(logn).
3.hashmap是有序存放的吗?
底层存放是没有顺序的,因为hash算法是散列计算,比如说存放key,分别是1-10;但是这些key在计算存
放数据位置的时候,它是散列的,是无序的。如果想实现有序的话,我们可以使用 link HashMap,它底
层采用了双线链表形式,来将我们的hashmap通过双线链表进行有序的链接起来。
4.hashmap扩容有死循环的问题吗?
hashmap7在做扩容的时候会发生死循环的问题(jdk官方不承认是bug,因为在多线程才会出现,jdk官方
要求使用在单线程问题下),会出现cpu变高的问题。多线程情况下,共享一些数据,确实会一些 多线程
安全问题.我们hashmap1.7的版本是采用头插法所以在多线程确实会引发,一些 死循环问题。所以在jdk
1.8版本改成了尾插法,避免该问题.并发的情况下使用我们currentHashMap.
5.hashmap key为null存放在index什么位置?
存放在index为0的位置,而hashtable是不允许key值为null的.

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值