} /** Implementation for put and putIfAbsent */ final V putVal(K key, V value, boolean onlyIfAbsent...onlyIfAbsent) e.val = value;...onlyIfAbsent) p.val = value; }
param hash hash for key * @param key the key * @param value the value to put * @param onlyIfAbsent...return previous value, or null if none */ final V putVal(int hash, K key, V value, boolean onlyIfAbsent...onlyIfAbsent || oldValue == null) e.value = value; afterNodeAccess
final V put(K key, int hash, V value, boolean onlyIfAbsent) { HashEntry node = tryLock() ?...onlyIfAbsent) { e.value = value; ++modCount;...final V putVal(K key, V value, boolean onlyIfAbsent) { if (key == null || value == null) throw new...onlyIfAbsent) e.val = value; break...onlyIfAbsent) p.val = value; }
i) 要插入的元素在Node数组里 ii) 要插入的元素在TreeNode里 iii) 要插入的元素链表里 3) 根据onlyIfAbsent...param hash hash for key * @param key the key * @param value the value to put * @param onlyIfAbsent...* @return previous value, or null if none */ final V putVal(int hash, K key, V value, boolean onlyIfAbsent...= null) { // existing mapping for key, will replace the old value once onlyifAbsent is false...onlyIfAbsent || oldValue == null) e.value = value; afterNodeAccess
put(K key, V value) { return putVal(key, value, false);} final V putVal(K key, V value, boolean onlyIfAbsent...else { // 如果这个桶不为空且不在迁移元素,则锁住这个桶(分段锁) // 并查找要插入的元素是否在这个桶中 // 存在,则替换值(onlyIfAbsent...onlyIfAbsent) e.val = value; break;...= null) { // 如果找到了这个元素,则赋值了新值(onlyIfAbsent=false)...onlyIfAbsent) p.val = value; }
key, V value) { return putVal(key, value, false); } final V putVal(K key, V value, boolean onlyIfAbsent...onlyIfAbsent) e.val = value;...onlyIfAbsent) p.val = value; }
0 : (h = key.hashCode()) ^ (h >>> 16); } final V putVal(int hash, K key, V value, boolean onlyIfAbsent...onlyIfAbsent || oldValue == null) e.value = value; afterNodeAccess(e); return oldValue;...final V putVal(int hash, K key, V value, boolean onlyIfAbsent, boolean evict) { Node[] tab; Node...onlyIfAbsent || oldValue == null) https:// value覆盖旧Node的值 e.value = value; afterNodeAccess
final V putVal(int hash, K key, V value, boolean onlyIfAbsent,boolean evict) { ### 标签:源码|集合 HashMap.Node...onlyIfAbsent || oldValue == null) e.value = value; afterNodeAccess(e);
public V put(K key, V value) { return putVal(hash(key), key, value, false, true); } // 第三个参数 onlyIfAbsent...,那么只有在不存在该 key 时才会进行 put 操作 // 第四个参数 evict 我们这里不关心 final V putVal(int hash, K key, V value, boolean onlyIfAbsent...onlyIfAbsent || oldValue == null) e.value = value; afterNodeAccess(e);
但只能有一个 不保证元素是有序的,取决于hash后,在确定索引结果 add源码 //核心操作putVal final V putVal(int hash, K key, V value, boolean onlyIfAbsent...= null) { // 记录e的value V oldValue = e.value; // onlyIfAbsent为false...onlyIfAbsent || oldValue == null) //用新值替换旧值 e.value = value;
V value) { return putVal(key, value, false); } /** Implementation for put and putIfAbsent */ //onlyIfAbsent...的意思是在put一个KV时,如果K已经存在什么也不做则返回null //如果不存在则put操作后返回V值 final V putVal(K key, V value, boolean onlyIfAbsent...onlyIfAbsent) e.val = value; break;...onlyIfAbsent) p.val = value; }
为原型创建一个新的Segment对象,放入Segment数组并返回; 2、然后是执行Segment的put操作: final V put(K key, int hash, V value, boolean onlyIfAbsent...onlyIfAbsent) { e.value = value; ++modCount;...sizeCtl为-2时,说明进行树化操作; sizeCtl为-3时,说明当前key与函数做映射运算; put方法与初始化 final V putVal(K key, V value, boolean onlyIfAbsent...onlyIfAbsent) e.val = value; break...onlyIfAbsent) p.val = value; }
final V putVal(int hash, K key, V value, boolean onlyIfAbsent, boolean evict) {...// 记录e的value V oldValue = e.value; /** * onlyIfAbsent...onlyIfAbsent || oldValue == null) e.value = value; // 访问后回调
、数据覆盖 在jdk1.8以后,改了1.7以前的小毛病,但是新的问题又来了,我们来看下源码: final V putVal(int hash, K key, V value, boolean onlyIfAbsent...onlyIfAbsent || oldValue == null) e.value = value; afterNodeAccess
param hash hash for key * @param key the key * @param value the value to put * @param onlyIfAbsent...return previous value, or null if none */ final V putVal(int hash, K key, V value, boolean onlyIfAbsent...onlyIfAbsent || oldValue == null) e.value = value; afterNodeAccess...onlyIfAbsent || oldValue == null) e.value = value; afterNodeAccess
V putVal(int hash,K key,V value, boolean onlyIfAbsent, boolean evict)先看看putVal的参数分别是:(键对应的hash值结果,键,值...final V putVal(int hash, K key, V value, boolean onlyIfAbsent, boolean evict) { Node...= null) { // existing mapping for key V oldValue = e.value; // 根据onlyIfAbsent参数决定是否更新值...onlyIfAbsent || oldValue == null) e.value = value; afterNodeAccess(e);