ConcurrentHashMap源码解析
面试题:对象是key的时候,concurrentHashMap怎么put的?
关键点在于
(1)求hash值:
//ConcurrentHashMap.java
static final int spread(int h) {
return (h ^ (h >>> 16)) & HASH_BITS;
}
(2)put过程关键点
for (Node<K,V> e = f;; ++binCount) {
K ek;
if (e.hash == hash &&
((ek = e.key) == key ||
(ek != null && key.equals(ek)))) {
oldVal = e.val;
if (!onlyIfAbsent)
e.val = value;
break;
}
Node<K,V> pred = e;
if ((e = e.next) == null) {
pred.next = new Node<K,V>(hash, key,
value, null);
break;
}
}
如果key的hash相等并且(key的地址相等或者key不为空且key的equals方法返回true),则说明两个key一致,需要覆盖原来concurrentHashMap的value。否则新建一个key、value放入table
如果有不明白的可以关注我加我微信哦~ 麻烦给个赞,谢谢