HashMap如何解决哈希冲突的?
- 计算hash值,基于hashCode计算
- 冲突之后,先是使用链式寻址法
- 当链表长度大于8,且hash表的容量大于60的时候,再添加元素则转化成红黑树
为什么计算hash值是,是将hash地址的值右移16取异或?
核心目的:减少hash冲突的概率。
hashMap什么时候扩容?
大于当前容量的75%时,执行扩容操作
当 HashMap 元素个数达到扩容阈值,默认是 12 的时候,会触发扩容。
默认扩容的大小是原来数组长度的 2 倍,HashMap 的最大容量是 Integer.MAX_VALUE,也就是 2^31-1。
HashMap会什么会产生死循环?
只有1.7存在这个问题,1.8已经解决了。头插法。
如果线程A和线程B同时触发了扩容操作,此时,A处于扩容中,而B线程已经扩容完成,则A对应的指针操作,此时A对应的节点如下:
死循环达成。
ConcurrentHashMap的底层实现原理?
线程安全===怎么实现的?syns?lock?
- 数据结构:数组+单向链表+红黑树组成
- 并发安全:对指定的node节点加锁,来保证数据更新的安全性
ConcurrentHashMap的size方法线程安全吗?
非线程安全方法。
ConcurrentHashMap 为什么不允许key为null?
线程安全的角度去考虑
ConcurrentHashMap 这么设计的原因是为了避免在多线程并发场景下的歧义问题。
也就是说,当一个线程从 ConcurrentHashMap 获取某个 key,如果返回的结果是 null 的时候。
这个线程无法确认,这个 null 表示的是确实不存在这个 key,还是说存在 key,但是 value 为空。
这种不确定性会造成线程安全性问题,而 ConcurrentHashMap 本身又是一个线程安全的集合。
所以才这么设计。