src/share/classes/java/util/HashMap.java

Print this page
rev 8192 : 8024688: j.u.Map.merge doesn't work as specified if contains key:null pair
Reviewed-by: duke


1213         Node<K,V> old = null;
1214         if (size > threshold || (tab = table) == null ||
1215             (n = tab.length) == 0)
1216             n = (tab = resize()).length;
1217         if ((first = tab[i = (n - 1) & hash]) != null) {
1218             if (first instanceof TreeNode)
1219                 old = (t = (TreeNode<K,V>)first).getTreeNode(hash, key);
1220             else {
1221                 Node<K,V> e = first; K k;
1222                 do {
1223                     if (e.hash == hash &&
1224                         ((k = e.key) == key || (key != null && key.equals(k)))) {
1225                         old = e;
1226                         break;
1227                     }
1228                     ++binCount;
1229                 } while ((e = e.next) != null);
1230             }
1231         }
1232         if (old != null) {
1233             V v = remappingFunction.apply(old.value, value);




1234             if (v != null) {
1235                 old.value = v;
1236                 afterNodeAccess(old);
1237             }
1238             else
1239                 removeNode(hash, key, null, false, true);
1240             return v;
1241         }
1242         if (value != null) {
1243             if (t != null)
1244                 t.putTreeVal(this, tab, hash, key, value);
1245             else {
1246                 tab[i] = newNode(hash, key, value, first);
1247                 if (binCount >= TREEIFY_THRESHOLD - 1)
1248                     treeifyBin(tab, hash);
1249             }
1250             ++modCount;
1251             ++size;
1252             afterNodeInsertion(true);
1253         }




1213         Node<K,V> old = null;
1214         if (size > threshold || (tab = table) == null ||
1215             (n = tab.length) == 0)
1216             n = (tab = resize()).length;
1217         if ((first = tab[i = (n - 1) & hash]) != null) {
1218             if (first instanceof TreeNode)
1219                 old = (t = (TreeNode<K,V>)first).getTreeNode(hash, key);
1220             else {
1221                 Node<K,V> e = first; K k;
1222                 do {
1223                     if (e.hash == hash &&
1224                         ((k = e.key) == key || (key != null && key.equals(k)))) {
1225                         old = e;
1226                         break;
1227                     }
1228                     ++binCount;
1229                 } while ((e = e.next) != null);
1230             }
1231         }
1232         if (old != null) {
1233             V v;
1234             if(old.value != null)
1235                 v = remappingFunction.apply(old.value, value);
1236             else
1237                 v = value;
1238             if (v != null) {
1239                 old.value = v;
1240                 afterNodeAccess(old);
1241             }
1242             else
1243                 removeNode(hash, key, null, false, true);
1244             return v;
1245         }
1246         if (value != null) {
1247             if (t != null)
1248                 t.putTreeVal(this, tab, hash, key, value);
1249             else {
1250                 tab[i] = newNode(hash, key, value, first);
1251                 if (binCount >= TREEIFY_THRESHOLD - 1)
1252                     treeifyBin(tab, hash);
1253             }
1254             ++modCount;
1255             ++size;
1256             afterNodeInsertion(true);
1257         }