HashMap

参考

HashMap核心知识点整理(持续更新)-优快云博客

史上最全HashMap面试题汇总-优快云博客

HashMap定义

  1. Hashmap由数组链表和红黑树构成,数组的初始长度是16,向数组中插入元素时如果产生hash冲突,会在产生冲突的位置生成链表,JDK1.7采用头插法,多线程时会出现死循环,JDK1.8采用尾插法可以避免死循环,如果链表的长度为8并且数组长度为64,会将链表转化成红黑树。如果数组长度小于64或者数组元素数量大于数组容量乘以0.75会进行扩容,扩容位原来长度的2倍。扩容后会将链表中的元素重新分配到新数组上,JDK1.7采用模运算,JDK1.8采用位运算,低位放到原来的位置,高位放的新位置,新位置的下标是元素的下标加上数组的长度
  2. 链表的时间复杂度是o(n),红黑树的时间复杂度是o(logn)
  3. 扩容因子小于0.75会导致频繁扩容,大于0.75会增加hash冲突
  4. 数组扩容为原来的2倍可以节约空间,减少hash冲突
  5. 数组扩容后为2的幂次方,可以提高运行速度减少hash冲突
  6. 链表的长度达到8会转成红黑树,红黑树的节点达到6会转成链表。

链表转红黑树的限制为何是8,红黑树转链表的限制为何是6

        小于8时操作链表比操作红黑树开销小。限制为6可以避免频繁转换

HashTable以及ConcurrentHashMap对比

        hashtable是全表锁,为每个方法都加锁,高并发下性能低已经过时了。ConcurrentHashMap是细颗粒度锁,为每个桶都加锁,高并发下性能高

如何使现有的HashMap线程安全 

        使用Collections.synchronizedMap /kəˈlɛkʃənz/(锁的是整个 Map 对象类似 Hashtable 的方式)

HashTable和ConcurrentHashMap在所有情况下都是线程安全的吗

        不是,大多数场景下是线程安全的,复合操作时不是线程安全的。比如先判断Key是否存在,存在的话就调用put方法,在多线程的情况下会出现旧值覆盖新值的情况

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值