jdk源码

jdk源码(二):你知道ConcurrentHashMap的具体实现细节吗?

白昼怎懂夜的黑 提交于 2019-11-29 19:35:28
1、首先抛出几个问题(文章最后有答案): a、ConcurrentHashMap在put的时候,key经过几次hash计算? b、segment 会增大吗? c、新的值是放在链表的表头还是表尾? 2、ConcurrentHashMap是如何存储数据的? 先看图: 从图中我们可以看出ConcurrentHashMap有两个种数据结构:数组和单向链表 那ConcurrentHashMap和如何存放一对key和value呢? put的具体过程: a、根据key计算hash值 b、根据hash值找到segment数组的下标 c、根据上面的下标获取tab数组, d、根据hash值,获取tab数组的下标 c、如果tab当前下标位置上没有值,就直接把存储有key和value的HashEntry存放在tab的当前下标下,否则就是形成一个链表(解决了Hash值冲突) 这就是整个put的大概过程。 是不是有小伙伴说,裤子都脱了,你给我看这个?哈哈哈哈哈,好,上代码 public V put(K key, V value) { Segment<K,V> s; if (value == null) throw new NullPointerException(); int hash = hash(key); // 根据key获取hash值 int j = (hash >>> segmentShift) &