jdk版本信息:
java version "1.8.0_181"
Java(TM) SE Runtime Environment (build 1.8.0_181-b13)
Java HotSpot(TM) 64-Bit Server VM (build 25.181-b13, mixed mode)
package java.util; import java.io.IOException; import java.io.InvalidObjectException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.io.Serializable; import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type; import java.util.Map.Entry; import java.util.function.BiConsumer; import java.util.function.BiFunction; import java.util.function.Consumer; import java.util.function.Function; import sun.misc.SharedSecrets; public class HashMap<K, V> extends AbstractMap<K, V> implements Map<K, V>, Cloneable, Serializable { private static final long serialVersionUID = 362498820763181265L; static final int DEFAULT_INITIAL_CAPACITY = 16; static final int MAXIMUM_CAPACITY = 1073741824; static final float DEFAULT_LOAD_FACTOR = 0.75F; static final int TREEIFY_THRESHOLD = 8; static final int UNTREEIFY_THRESHOLD = 6; static final int MIN_TREEIFY_CAPACITY = 64; transient HashMap.Node<K, V>[] table; transient Set<Entry<K, V>> entrySet; transient int size; transient int modCount; int threshold; final float loadFactor; static final int hash(Object var0) { int var1; return var0 == null ? 0 : (var1 = var0.hashCode()) ^ var1 >>> 16; } static Class<?> comparableClassFor(Object var0) { if (var0 instanceof Comparable) { Class var1; if ((var1 = var0.getClass()) == String.class) { return var1; } Type[] var2; if ((var2 = var1.getGenericInterfaces()) != null) { for(int var6 = 0; var6 < var2.length; ++var6) { Type[] var3; Type var4; ParameterizedType var5; if ((var4 = var2[var6]) instanceof ParameterizedType && (var5 = (ParameterizedType)var4).getRawType() == Comparable.class && (var3 = var5.getActualTypeArguments()) != null && var3.length == 1 && var3[0] == var1) { return var1; } } } } return null; } static int compareComparables(Class<?> var0, Object var1, Object var2) { return var2 != null && var2.getClass() == var0 ? ((Comparable)var1).compareTo(var2) : 0; } static final int tableSizeFor(int var0) { int var1 = var0 - 1; var1 |= var1 >>> 1; var1 |= var1 >>> 2; var1 |= var1 >>> 4; var1 |= var1 >>> 8; var1 |= var1 >>> 16; return var1 < 0 ? 1 : (var1 >= 1073741824 ? 1073741824 : var1 + 1); } public HashMap(int var1, float var2) { if (var1 < 0) { throw new IllegalArgumentException("Illegal initial capacity: " + var1); } else { if (var1 > 1073741824) { var1 = 1073741824; } if (var2 > 0.0F && !Float.isNaN(var2)) { this.loadFactor = var2; this.threshold = tableSizeFor(var1); } else { throw new IllegalArgumentException("Illegal load factor: " + var2); } } } public HashMap(int var1) { this(var1, 0.75F); } public HashMap() { this.loadFactor = 0.75F; } public HashMap(Map<? extends K, ? extends V> var1) { this.loadFactor = 0.75F; this.putMapEntries(var1, false); } final void putMapEntries(Map<? extends K, ? extends V> var1, boolean var2) { int var3 = var1.size(); if (var3 > 0) { if (this.table == null) { float var4 = (float)var3 / this.loadFactor + 1.0F; int var5 = var4 < 1.07374182E9F ? (int)var4 : 1073741824; if (var5 > this.threshold) { this.threshold = tableSizeFor(var5); } } else if (var3 > this.threshold) { this.resize(); } Iterator var8 = var1.entrySet().iterator(); while(var8.hasNext()) { Entry var9 = (Entry)var8.next(); Object var6 = var9.getKey(); Object var7 = var9.getValue(); this.putVal(hash(var6), var6, var7, false, var2); } } } public int size() { return this.size; } public boolean isEmpty() { return this.size == 0; } public V get(Object var1) { HashMap.Node var2; return (var2 = this.getNode(hash(var1), var1)) == null ? null : var2.value; } final HashMap.Node<K, V> getNode(int var1, Object var2) { HashMap.Node[] var3 = this.table; HashMap.Node var4; int var6; if (this.table != null && (var6 = var3.length) > 0 && (var4 = var3[var6 - 1 & var1]) != null) { Object var7; if (var4.hash == var1) { var7 = var4.key; if (var4.key == var2 || var2 != null && var2.equals(var7)) { return var4; } } HashMap.Node var5 = var4.next; if (var4.next != null) { if (var4 instanceof HashMap.TreeNode) { return ((HashMap.TreeNode)var4).getTreeNode(var1, var2); } do { if (var5.hash == var1) { var7 = var5.key; if (var5.key == var2 || var2 != null && var2.equals(var7)) { return var5; } } } while((var5 = var5.next) != null); } } return null; } public boolean containsKey(Object var1) { return this.getNode(hash(var1), var1) != null; } public V put(K var1, V var2) { return this.putVal(hash(var1), var1, var2, false, true); } final V putVal(int var1, K var2, V var3, boolean var4, boolean var5) { HashMap.Node[] var6 = this.table; int var8; if (this.table == null || (var8 = var6.length) == 0) { var8 = (var6 = this.resize()).length; } Object var7; int var9; if ((var7 = var6[var9 = var8 - 1 & var1]) == null) { var6[var9] = this.newNode(var1, var2, var3, (HashMap.Node)null); } else { Object var10; label79: { Object var11; if (((HashMap.Node)var7).hash == var1) { var11 = ((HashMap.Node)var7).key; if (((HashMap.Node)var7).key == var2 || var2 != null && var2.equals(var11)) { var10 = var7; break label79; } } if (var7 instanceof HashMap.TreeNode) { var10 = ((HashMap.TreeNode)var7).putTreeVal(this, var6, var1, var2, var3); } else { int var12 = 0; while(true) { var10 = ((HashMap.Node)var7).next; if (((HashMap.Node)var7).next == null) { ((HashMap.Node)var7).next = this.newNode(var1, var2, var3, (HashMap.Node)null); if (var12 >= 7) { this.treeifyBin(var6, var1); } break; } if (((HashMap.Node)var10).hash == var1) { var11 = ((HashMap.Node)var10).key; if (((HashMap.Node)var10).key == var2 || var2 != null && var2.equals(var11)) { break; } } var7 = var10; ++var12; } } } if (var10 != null) { Object var13 = ((HashMap.Node)var10).value; if (!var4 || var13 == null) { ((HashMap.Node)var10).value = var3; } this.afterNodeAccess((HashMap.Node)var10); return var13; } } ++this.modCount; if (++this.size > this.threshold) { this.resize(); } this.afterNodeInsertion(var5); return null; } final HashMap.Node<K, V>[] resize() { HashMap.Node[] var1 = this.table; int var2 = var1 == null ? 0 : var1.length; int var3 = this.threshold; int var5 = 0; int var4; if (var2 > 0) { if (var2 >= 1073741824) { this.threshold = 2147483647; return var1; } if ((var4 = var2 << 1) < 1073741824 && var2 >= 16) { var5 = var3 << 1; } } else if (var3 > 0) { var4 = var3; } else { var4 = 16; var5 = 12; } if (var5 == 0) { float var6 = (float)var4 * this.loadFactor; var5 = var4 < 1073741824 && var6 < 1.07374182E9F ? (int)var6 : 2147483647; } this.threshold = var5; HashMap.Node[] var14 = (HashMap.Node[])(new HashMap.Node[var4]); this.table = var14; if (var1 != null) { for(int var7 = 0; var7 < var2; ++var7) { HashMap.Node var8; if ((var8 = var1[var7]) != null) { var1[var7] = null; if (var8.next == null) { var14[var8.hash & var4 - 1] = var8; } else if (var8 instanceof HashMap.TreeNode) { ((HashMap.TreeNode)var8).split(this, var14, var7, var2); } else { HashMap.Node var9 = null; HashMap.Node var10 = null; HashMap.Node var11 = null; HashMap.Node var12 = null; HashMap.Node var13; do { var13 = var8.next; if ((var8.hash & var2) == 0) { if (var10 == null) { var9 = var8; } else { var10.next = var8; } var10 = var8; } else { if (var12 == null) { var11 = var8; } else { var12.next = var8; } var12 = var8; } var8 = var13; } while(var13 != null); if (var10 != null) { var10.next = null; var14[var7] = var9; } if (var12 != null) { var12.next = null; var14[var7 + var2] = var11; } } } } } return var14; } final void treeifyBin(HashMap.Node<K, V>[] var1, int var2) { int var3; if (var1 != null && (var3 = var1.length) >= 64) { int var4; HashMap.Node var5; if ((var5 = var1[var4 = var3 - 1 & var2]) != null) { HashMap.TreeNode var6 = null; HashMap.TreeNode var7 = null; do { HashMap.TreeNode var8 = this.replacementTreeNode(var5, (HashMap.Node)null); if (var7 == null) { var6 = var8; } else { var8.prev = var7; var7.next = var8; } var7 = var8; } while((var5 = var5.next) != null); if ((var1[var4] = var6) != null) { var6.treeify(var1); } } } else { this.resize(); } } public void putAll(Map<? extends K, ? extends V> var1) { this.putMapEntries(var1, true); } public V remove(Object var1) { HashMap.Node var2; return (var2 = this.removeNode(hash(var1), var1, (Object)null, false, true)) == null ? null : var2.value; } final HashMap.Node<K, V> removeNode(int var1, Object var2, Object var3, boolean var4, boolean var5) { HashMap.Node[] var6; HashMap.Node var7; int var9; Object var10; label89: { var6 = this.table; int var8; if (this.table != null && (var8 = var6.length) > 0 && (var7 = var6[var9 = var8 - 1 & var1]) != null) { label90: { var10 = null; Object var12; if (var7.hash == var1) { var12 = var7.key; if (var7.key == var2 || var2 != null && var2.equals(var12)) { var10 = var7; break label90; } } HashMap.Node var11 = var7.next; if (var7.next != null) { if (var7 instanceof HashMap.TreeNode) { var10 = ((HashMap.TreeNode)var7).getTreeNode(var1, var2); } else { do { if (var11.hash == var1) { var12 = var11.key; if (var11.key == var2 || var2 != null && var2.equals(var12)) { var10 = var11; break; } } var7 = var11; } while((var11 = var11.next) != null); } } } if (var10 != null) { if (!var4) { break label89; } Object var13 = ((HashMap.Node)var10).value; if (((HashMap.Node)var10).value == var3 || var3 != null && var3.equals(var13)) { break label89; } } } return null; } if (var10 instanceof HashMap.TreeNode) { ((HashMap.TreeNode)var10).removeTreeNode(this, var6, var5); } else if (var10 == var7) { var6[var9] = ((HashMap.Node)var10).next; } else { var7.next = ((HashMap.Node)var10).next; } ++this.modCount; --this.size; this.afterNodeRemoval((HashMap.Node)var10); return (HashMap.Node)var10; } public void clear() { ++this.modCount; HashMap.Node[] var1 = this.table; if (this.table != null && this.size > 0) { this.size = 0; for(int var2 = 0; var2 < var1.length; ++var2) { var1[var2] = null; } } } public boolean containsValue(Object var1) { HashMap.Node[] var2 = this.table; if (this.table != null && this.size > 0) { for(int var4 = 0; var4 < var2.length; ++var4) { for(HashMap.Node var5 = var2[var4]; var5 != null; var5 = var5.next) { Object var3 = var5.value; if (var5.value == var1 || var1 != null && var1.equals(var3)) { return true; } } } } return false; } public Set<K> keySet() { Object var1 = this.keySet; if (var1 == null) { var1 = new HashMap.KeySet(); this.keySet = (Set)var1; } return (Set)var1; } public Collection<V> values() { Object var1 = this.values; if (var1 == null) { var1 = new HashMap.Values(); this.values = (Collection)var1; } return (Collection)var1; } public Set<Entry<K, V>> entrySet() { Set var1 = this.entrySet; return this.entrySet == null ? (this.entrySet = new HashMap.EntrySet()) : var1; } public V getOrDefault(Object var1, V var2) { HashMap.Node var3; return (var3 = this.getNode(hash(var1), var1)) == null ? var2 : var3.value; } public V putIfAbsent(K var1, V var2) { return this.putVal(hash(var1), var1, var2, true, true); } public boolean remove(Object var1, Object var2) { return this.removeNode(hash(var1), var1, var2, true, true) != null; } public boolean replace(K var1, V var2, V var3) { HashMap.Node var4; if ((var4 = this.getNode(hash(var1), var1)) != null) { Object var5 = var4.value; if (var4.value == var2 || var5 != null && var5.equals(var2)) { var4.value = var3; this.afterNodeAccess(var4); return true; } } return false; } public V replace(K var1, V var2) { HashMap.Node var3; if ((var3 = this.getNode(hash(var1), var1)) != null) { Object var4 = var3.value; var3.value = var2; this.afterNodeAccess(var3); return var4; } else { return null; } } public V computeIfAbsent(K var1, Function<? super K, ? extends V> var2) { if (var2 == null) { throw new NullPointerException(); } else { int var3; HashMap.Node[] var4; int var6; int var8; HashMap.TreeNode var9; Object var10; label63: { var3 = hash(var1); var8 = 0; var9 = null; var10 = null; if (this.size <= this.threshold) { var4 = this.table; if (this.table != null && (var6 = var4.length) != 0) { break label63; } } var6 = (var4 = this.resize()).length; } HashMap.Node var5; int var7; Object var13; if ((var5 = var4[var7 = var6 - 1 & var3]) != null) { if (var5 instanceof HashMap.TreeNode) { var10 = (var9 = (HashMap.TreeNode)var5).getTreeNode(var3, var1); } else { HashMap.Node var11 = var5; do { if (var11.hash == var3) { Object var12 = var11.key; if (var11.key == var1 || var1 != null && var1.equals(var12)) { var10 = var11; break; } } ++var8; } while((var11 = var11.next) != null); } if (var10 != null) { var13 = ((HashMap.Node)var10).value; if (((HashMap.Node)var10).value != null) { this.afterNodeAccess((HashMap.Node)var10); return var13; } } } var13 = var2.apply(var1); if (var13 == null) { return null; } else if (var10 != null) { ((HashMap.Node)var10).value = var13; this.afterNodeAccess((HashMap.Node)var10); return var13; } else { if (var9 != null) { var9.putTreeVal(this, var4, var3, var1, var13); } else { var4[var7] = this.newNode(var3, var1, var13, var5); if (var8 >= 7) { this.treeifyBin(var4, var3); } } ++this.modCount; ++this.size; this.afterNodeInsertion(true); return var13; } } } public V computeIfPresent(K var1, BiFunction<? super K, ? super V, ? extends V> var2) { if (var2 == null) { throw new NullPointerException(); } else { int var5 = hash(var1); HashMap.Node var3; if ((var3 = this.getNode(var5, var1)) != null) { Object var4 = var3.value; if (var3.value != null) { Object var6 = var2.apply(var1, var4); if (var6 != null) { var3.value = var6; this.afterNodeAccess(var3); return var6; } this.removeNode(var5, var1, (Object)null, false, true); } } return null; } } public V compute(K var1, BiFunction<? super K, ? super V, ? extends V> var2) { if (var2 == null) { throw new NullPointerException(); } else { int var3; HashMap.Node[] var4; int var6; int var8; HashMap.TreeNode var9; Object var10; label63: { var3 = hash(var1); var8 = 0; var9 = null; var10 = null; if (this.size <= this.threshold) { var4 = this.table; if (this.table != null && (var6 = var4.length) != 0) { break label63; } } var6 = (var4 = this.resize()).length; } HashMap.Node var5; int var7; Object var12; if ((var5 = var4[var7 = var6 - 1 & var3]) != null) { if (var5 instanceof HashMap.TreeNode) { var10 = (var9 = (HashMap.TreeNode)var5).getTreeNode(var3, var1); } else { HashMap.Node var11 = var5; do { if (var11.hash == var3) { var12 = var11.key; if (var11.key == var1 || var1 != null && var1.equals(var12)) { var10 = var11; break; } } ++var8; } while((var11 = var11.next) != null); } } Object var13 = var10 == null ? null : ((HashMap.Node)var10).value; var12 = var2.apply(var1, var13); if (var10 != null) { if (var12 != null) { ((HashMap.Node)var10).value = var12; this.afterNodeAccess((HashMap.Node)var10); } else { this.removeNode(var3, var1, (Object)null, false, true); } } else if (var12 != null) { if (var9 != null) { var9.putTreeVal(this, var4, var3, var1, var12); } else { var4[var7] = this.newNode(var3, var1, var12, var5); if (var8 >= 7) { this.treeifyBin(var4, var3); } } ++this.modCount; ++this.size; this.afterNodeInsertion(true); } return var12; } } public V merge(K var1, V var2, BiFunction<? super V, ? super V, ? extends V> var3) { if (var2 == null) { throw new NullPointerException(); } else if (var3 == null) { throw new NullPointerException(); } else { int var4; HashMap.Node[] var5; int var7; int var9; HashMap.TreeNode var10; Object var11; label68: { var4 = hash(var1); var9 = 0; var10 = null; var11 = null; if (this.size <= this.threshold) { var5 = this.table; if (this.table != null && (var7 = var5.length) != 0) { break label68; } } var7 = (var5 = this.resize()).length; } HashMap.Node var6; int var8; if ((var6 = var5[var8 = var7 - 1 & var4]) != null) { if (var6 instanceof HashMap.TreeNode) { var11 = (var10 = (HashMap.TreeNode)var6).getTreeNode(var4, var1); } else { HashMap.Node var12 = var6; do { if (var12.hash == var4) { Object var13 = var12.key; if (var12.key == var1 || var1 != null && var1.equals(var13)) { var11 = var12; break; } } ++var9; } while((var12 = var12.next) != null); } } if (var11 != null) { Object var14; if (((HashMap.Node)var11).value != null) { var14 = var3.apply(((HashMap.Node)var11).value, var2); } else { var14 = var2; } if (var14 != null) { ((HashMap.Node)var11).value = var14; this.afterNodeAccess((HashMap.Node)var11); } else { this.removeNode(var4, var1, (Object)null, false, true); } return var14; } else { if (var2 != null) { if (var10 != null) { var10.putTreeVal(this, var5, var4, var1, var2); } else { var5[var8] = this.newNode(var4, var1, var2, var6); if (var9 >= 7) { this.treeifyBin(var5, var4); } } ++this.modCount; ++this.size; this.afterNodeInsertion(true); } return var2; } } } public void forEach(BiConsumer<? super K, ? super V> var1) { if (var1 == null) { throw new NullPointerException(); } else { if (this.size > 0) { HashMap.Node[] var2 = this.table; if (this.table != null) { int var3 = this.modCount; for(int var4 = 0; var4 < var2.length; ++var4) { for(HashMap.Node var5 = var2[var4]; var5 != null; var5 = var5.next) { var1.accept(var5.key, var5.value); } } if (this.modCount != var3) { throw new ConcurrentModificationException(); } } } } } public void replaceAll(BiFunction<? super K, ? super V, ? extends V> var1) { if (var1 == null) { throw new NullPointerException(); } else { if (this.size > 0) { HashMap.Node[] var2 = this.table; if (this.table != null) { int var3 = this.modCount; for(int var4 = 0; var4 < var2.length; ++var4) { for(HashMap.Node var5 = var2[var4]; var5 != null; var5 = var5.next) { var5.value = var1.apply(var5.key, var5.value); } } if (this.modCount != var3) { throw new ConcurrentModificationException(); } } } } } public Object clone() { HashMap var1; try { var1 = (HashMap)super.clone(); } catch (CloneNotSupportedException var3) { throw new InternalError(var3); } var1.reinitialize(); var1.putMapEntries(this, false); return var1; } final float loadFactor() { return this.loadFactor; } final int capacity() { return this.table != null ? this.table.length : (this.threshold > 0 ? this.threshold : 16); } private void writeObject(ObjectOutputStream var1) throws IOException { int var2 = this.capacity(); var1.defaultWriteObject(); var1.writeInt(var2); var1.writeInt(this.size); this.internalWriteEntries(var1); } private void readObject(ObjectInputStream var1) throws IOException, ClassNotFoundException { var1.defaultReadObject(); this.reinitialize(); if (this.loadFactor > 0.0F && !Float.isNaN(this.loadFactor)) { var1.readInt(); int var2 = var1.readInt(); if (var2 < 0) { throw new InvalidObjectException("Illegal mappings count: " + var2); } else { if (var2 > 0) { float var3 = Math.min(Math.max(0.25F, this.loadFactor), 4.0F); float var4 = (float)var2 / var3 + 1.0F; int var5 = var4 < 16.0F ? 16 : (var4 >= 1.07374182E9F ? 1073741824 : tableSizeFor((int)var4)); float var6 = (float)var5 * var3; this.threshold = var5 < 1073741824 && var6 < 1.07374182E9F ? (int)var6 : 2147483647; SharedSecrets.getJavaOISAccess().checkArray(var1, Entry[].class, var5); HashMap.Node[] var7 = (HashMap.Node[])(new HashMap.Node[var5]); this.table = var7; for(int var8 = 0; var8 < var2; ++var8) { Object var9 = var1.readObject(); Object var10 = var1.readObject(); this.putVal(hash(var9), var9, var10, false, false); } } } } else { throw new InvalidObjectException("Illegal load factor: " + this.loadFactor); } } HashMap.Node<K, V> newNode(int var1, K var2, V var3, HashMap.Node<K, V> var4) { return new HashMap.Node(var1, var2, var3, var4); } HashMap.Node<K, V> replacementNode(HashMap.Node<K, V> var1, HashMap.Node<K, V> var2) { return new HashMap.Node(var1.hash, var1.key, var1.value, var2); } HashMap.TreeNode<K, V> newTreeNode(int var1, K var2, V var3, HashMap.Node<K, V> var4) { return new HashMap.TreeNode(var1, var2, var3, var4); } HashMap.TreeNode<K, V> replacementTreeNode(HashMap.Node<K, V> var1, HashMap.Node<K, V> var2) { return new HashMap.TreeNode(var1.hash, var1.key, var1.value, var2); } void reinitialize() { this.table = null; this.entrySet = null; this.keySet = null; this.values = null; this.modCount = 0; this.threshold = 0; this.size = 0; } void afterNodeAccess(HashMap.Node<K, V> var1) { } void afterNodeInsertion(boolean var1) { } void afterNodeRemoval(HashMap.Node<K, V> var1) { } void internalWriteEntries(ObjectOutputStream var1) throws IOException { if (this.size > 0) { HashMap.Node[] var2 = this.table; if (this.table != null) { for(int var3 = 0; var3 < var2.length; ++var3) { for(HashMap.Node var4 = var2[var3]; var4 != null; var4 = var4.next) { var1.writeObject(var4.key); var1.writeObject(var4.value); } } } } } final class EntryIterator extends HashMap<K, V>.HashIterator implements Iterator<Entry<K, V>> { EntryIterator() { super(); } public final Entry<K, V> next() { return this.nextNode(); } } final class EntrySet extends AbstractSet<Entry<K, V>> { EntrySet() { } public final int size() { return HashMap.this.size; } public final void clear() { HashMap.this.clear(); } public final Iterator<Entry<K, V>> iterator() { return HashMap.this.new EntryIterator(); } public final boolean contains(Object var1) { if (!(var1 instanceof Entry)) { return false; } else { Entry var2 = (Entry)var1; Object var3 = var2.getKey(); HashMap.Node var4 = HashMap.this.getNode(HashMap.hash(var3), var3); return var4 != null && var4.equals(var2); } } public final boolean remove(Object var1) { if (var1 instanceof Entry) { Entry var2 = (Entry)var1; Object var3 = var2.getKey(); Object var4 = var2.getValue(); return HashMap.this.removeNode(HashMap.hash(var3), var3, var4, true, true) != null; } else { return false; } } public final Spliterator<Entry<K, V>> spliterator() { return new HashMap.EntrySpliterator(HashMap.this, 0, -1, 0, 0); } public final void forEach(Consumer<? super Entry<K, V>> var1) { if (var1 == null) { throw new NullPointerException(); } else { if (HashMap.this.size > 0) { HashMap.Node[] var2 = HashMap.this.table; if (HashMap.this.table != null) { int var3 = HashMap.this.modCount; for(int var4 = 0; var4 < var2.length; ++var4) { for(HashMap.Node var5 = var2[var4]; var5 != null; var5 = var5.next) { var1.accept(var5); } } if (HashMap.this.modCount != var3) { throw new ConcurrentModificationException(); } } } } } } static final class EntrySpliterator<K, V> extends HashMap.HashMapSpliterator<K, V> implements Spliterator<Entry<K, V>> { EntrySpliterator(HashMap<K, V> var1, int var2, int var3, int var4, int var5) { super(var1, var2, var3, var4, var5); } public HashMap.EntrySpliterator<K, V> trySplit() { int var1 = this.getFence(); int var2 = this.index; int var3 = var2 + var1 >>> 1; return var2 < var3 && this.current == null ? new HashMap.EntrySpliterator(this.map, var2, this.index = var3, this.est >>>= 1, this.expectedModCount) : null; } public void forEachRemaining(Consumer<? super Entry<K, V>> var1) { if (var1 == null) { throw new NullPointerException(); } else { HashMap var5 = this.map; HashMap.Node[] var6 = var5.table; int var3 = this.fence; int var4; if (this.fence < 0) { var4 = this.expectedModCount = var5.modCount; var3 = this.fence = var6 == null ? 0 : var6.length; } else { var4 = this.expectedModCount; } if (var6 != null && var6.length >= var3) { int var2 = this.index; if (this.index >= 0 && (var2 < (this.index = var3) || this.current != null)) { HashMap.Node var7 = this.current; this.current = null; do { do { if (var7 == null) { var7 = var6[var2++]; } else { var1.accept(var7); var7 = var7.next; } } while(var7 != null); } while(var2 < var3); if (var5.modCount != var4) { throw new ConcurrentModificationException(); } } } } } public boolean tryAdvance(Consumer<? super Entry<K, V>> var1) { if (var1 == null) { throw new NullPointerException(); } else { HashMap.Node[] var3 = this.map.table; int var2; if (var3 != null && var3.length >= (var2 = this.getFence()) && this.index >= 0) { while(this.current != null || this.index < var2) { if (this.current != null) { HashMap.Node var4 = this.current; this.current = this.current.next; var1.accept(var4); if (this.map.modCount != this.expectedModCount) { throw new ConcurrentModificationException(); } return true; } this.current = var3[this.index++]; } } return false; } } public int characteristics() { return (this.fence >= 0 && this.est != this.map.size ? 0 : 64) | 1; } } abstract class HashIterator { HashMap.Node<K, V> next; HashMap.Node<K, V> current; int expectedModCount; int index; HashIterator() { this.expectedModCount = HashMap.this.modCount; HashMap.Node[] var2 = HashMap.this.table; this.current = this.next = null; this.index = 0; if (var2 != null && HashMap.this.size > 0) { while(this.index < var2.length && (this.next = var2[this.index++]) == null) { ; } } } public final boolean hasNext() { return this.next != null; } final HashMap.Node<K, V> nextNode() { HashMap.Node var2 = this.next; if (HashMap.this.modCount != this.expectedModCount) { throw new ConcurrentModificationException(); } else if (var2 == null) { throw new NoSuchElementException(); } else { if ((this.next = (this.current = var2).next) == null) { HashMap.Node[] var1 = HashMap.this.table; if (HashMap.this.table != null) { while(this.index < var1.length && (this.next = var1[this.index++]) == null) { ; } } } return var2; } } public final void remove() { HashMap.Node var1 = this.current; if (var1 == null) { throw new IllegalStateException(); } else if (HashMap.this.modCount != this.expectedModCount) { throw new ConcurrentModificationException(); } else { this.current = null; Object var2 = var1.key; HashMap.this.removeNode(HashMap.hash(var2), var2, (Object)null, false, false); this.expectedModCount = HashMap.this.modCount; } } } static class HashMapSpliterator<K, V> { final HashMap<K, V> map; HashMap.Node<K, V> current; int index; int fence; int est; int expectedModCount; HashMapSpliterator(HashMap<K, V> var1, int var2, int var3, int var4, int var5) { this.map = var1; this.index = var2; this.fence = var3; this.est = var4; this.expectedModCount = var5; } final int getFence() { int var1 = this.fence; if (this.fence < 0) { HashMap var2 = this.map; this.est = var2.size; this.expectedModCount = var2.modCount; HashMap.Node[] var3 = var2.table; var1 = this.fence = var3 == null ? 0 : var3.length; } return var1; } public final long estimateSize() { this.getFence(); return (long)this.est; } } final class KeyIterator extends HashMap<K, V>.HashIterator implements Iterator<K> { KeyIterator() { super(); } public final K next() { return this.nextNode().key; } } final class KeySet extends AbstractSet<K> { KeySet() { } public final int size() { return HashMap.this.size; } public final void clear() { HashMap.this.clear(); } public final Iterator<K> iterator() { return HashMap.this.new KeyIterator(); } public final boolean contains(Object var1) { return HashMap.this.containsKey(var1); } public final boolean remove(Object var1) { return HashMap.this.removeNode(HashMap.hash(var1), var1, (Object)null, false, true) != null; } public final Spliterator<K> spliterator() { return new HashMap.KeySpliterator(HashMap.this, 0, -1, 0, 0); } public final void forEach(Consumer<? super K> var1) { if (var1 == null) { throw new NullPointerException(); } else { if (HashMap.this.size > 0) { HashMap.Node[] var2 = HashMap.this.table; if (HashMap.this.table != null) { int var3 = HashMap.this.modCount; for(int var4 = 0; var4 < var2.length; ++var4) { for(HashMap.Node var5 = var2[var4]; var5 != null; var5 = var5.next) { var1.accept(var5.key); } } if (HashMap.this.modCount != var3) { throw new ConcurrentModificationException(); } } } } } } static final class KeySpliterator<K, V> extends HashMap.HashMapSpliterator<K, V> implements Spliterator<K> { KeySpliterator(HashMap<K, V> var1, int var2, int var3, int var4, int var5) { super(var1, var2, var3, var4, var5); } public HashMap.KeySpliterator<K, V> trySplit() { int var1 = this.getFence(); int var2 = this.index; int var3 = var2 + var1 >>> 1; return var2 < var3 && this.current == null ? new HashMap.KeySpliterator(this.map, var2, this.index = var3, this.est >>>= 1, this.expectedModCount) : null; } public void forEachRemaining(Consumer<? super K> var1) { if (var1 == null) { throw new NullPointerException(); } else { HashMap var5 = this.map; HashMap.Node[] var6 = var5.table; int var3 = this.fence; int var4; if (this.fence < 0) { var4 = this.expectedModCount = var5.modCount; var3 = this.fence = var6 == null ? 0 : var6.length; } else { var4 = this.expectedModCount; } if (var6 != null && var6.length >= var3) { int var2 = this.index; if (this.index >= 0 && (var2 < (this.index = var3) || this.current != null)) { HashMap.Node var7 = this.current; this.current = null; do { do { if (var7 == null) { var7 = var6[var2++]; } else { var1.accept(var7.key); var7 = var7.next; } } while(var7 != null); } while(var2 < var3); if (var5.modCount != var4) { throw new ConcurrentModificationException(); } } } } } public boolean tryAdvance(Consumer<? super K> var1) { if (var1 == null) { throw new NullPointerException(); } else { HashMap.Node[] var3 = this.map.table; int var2; if (var3 != null && var3.length >= (var2 = this.getFence()) && this.index >= 0) { while(this.current != null || this.index < var2) { if (this.current != null) { Object var4 = this.current.key; this.current = this.current.next; var1.accept(var4); if (this.map.modCount != this.expectedModCount) { throw new ConcurrentModificationException(); } return true; } this.current = var3[this.index++]; } } return false; } } public int characteristics() { return (this.fence >= 0 && this.est != this.map.size ? 0 : 64) | 1; } } static class Node<K, V> implements Entry<K, V> { final int hash; final K key; V value; HashMap.Node<K, V> next; Node(int var1, K var2, V var3, HashMap.Node<K, V> var4) { this.hash = var1; this.key = var2; this.value = var3; this.next = var4; } public final K getKey() { return this.key; } public final V getValue() { return this.value; } public final String toString() { return this.key + "=" + this.value; } public final int hashCode() { return Objects.hashCode(this.key) ^ Objects.hashCode(this.value); } public final V setValue(V var1) { Object var2 = this.value; this.value = var1; return var2; } public final boolean equals(Object var1) { if (var1 == this) { return true; } else { if (var1 instanceof Entry) { Entry var2 = (Entry)var1; if (Objects.equals(this.key, var2.getKey()) && Objects.equals(this.value, var2.getValue())) { return true; } } return false; } } } static final class TreeNode<K, V> extends java.util.LinkedHashMap.Entry<K, V> { HashMap.TreeNode<K, V> parent; HashMap.TreeNode<K, V> left; HashMap.TreeNode<K, V> right; HashMap.TreeNode<K, V> prev; boolean red; TreeNode(int var1, K var2, V var3, HashMap.Node<K, V> var4) { super(var1, var2, var3, var4); } final HashMap.TreeNode<K, V> root() { HashMap.TreeNode var1 = this; while(true) { HashMap.TreeNode var2 = var1.parent; if (var1.parent == null) { return var1; } var1 = var2; } } static <K, V> void moveRootToFront(HashMap.Node<K, V>[] var0, HashMap.TreeNode<K, V> var1) { int var2; if (var1 != null && var0 != null && (var2 = var0.length) > 0) { int var3 = var2 - 1 & var1.hash; HashMap.TreeNode var4 = (HashMap.TreeNode)var0[var3]; if (var1 != var4) { var0[var3] = var1; HashMap.TreeNode var6 = var1.prev; HashMap.Node var5 = var1.next; if (var1.next != null) { ((HashMap.TreeNode)var5).prev = var6; } if (var6 != null) { var6.next = var5; } if (var4 != null) { var4.prev = var1; } var1.next = var4; var1.prev = null; } assert checkInvariants(var1); } } final HashMap.TreeNode<K, V> find(int var1, Object var2, Class<?> var3) { HashMap.TreeNode var4 = this; do { HashMap.TreeNode var8 = var4.left; HashMap.TreeNode var9 = var4.right; int var5 = var4.hash; if (var4.hash > var1) { var4 = var8; } else if (var5 < var1) { var4 = var9; } else { Object var7 = var4.key; if (var4.key == var2 || var2 != null && var2.equals(var7)) { return var4; } if (var8 == null) { var4 = var9; } else if (var9 == null) { var4 = var8; } else { int var6; if ((var3 != null || (var3 = HashMap.comparableClassFor(var2)) != null) && (var6 = HashMap.compareComparables(var3, var2, var7)) != 0) { var4 = var6 < 0 ? var8 : var9; } else { HashMap.TreeNode var10; if ((var10 = var9.find(var1, var2, var3)) != null) { return var10; } var4 = var8; } } } } while(var4 != null); return null; } final HashMap.TreeNode<K, V> getTreeNode(int var1, Object var2) { return (this.parent != null ? this.root() : this).find(var1, var2, (Class)null); } static int tieBreakOrder(Object var0, Object var1) { int var2; if (var0 == null || var1 == null || (var2 = var0.getClass().getName().compareTo(var1.getClass().getName())) == 0) { var2 = System.identityHashCode(var0) <= System.identityHashCode(var1) ? -1 : 1; } return var2; } final void treeify(HashMap.Node<K, V>[] var1) { HashMap.TreeNode var2 = null; HashMap.TreeNode var4; for(HashMap.TreeNode var3 = this; var3 != null; var3 = var4) { var4 = (HashMap.TreeNode)var3.next; var3.left = var3.right = null; if (var2 == null) { var3.parent = null; var3.red = false; var2 = var3; } else { Object var5 = var3.key; int var6 = var3.hash; Class var7 = null; HashMap.TreeNode var8 = var2; int var9; HashMap.TreeNode var12; do { Object var11 = var8.key; int var10 = var8.hash; if (var8.hash > var6) { var9 = -1; } else if (var10 < var6) { var9 = 1; } else if (var7 == null && (var7 = HashMap.comparableClassFor(var5)) == null || (var9 = HashMap.compareComparables(var7, var5, var11)) == 0) { var9 = tieBreakOrder(var5, var11); } var12 = var8; } while((var8 = var9 <= 0 ? var8.left : var8.right) != null); var3.parent = var12; if (var9 <= 0) { var12.left = var3; } else { var12.right = var3; } var2 = balanceInsertion(var2, var3); } } moveRootToFront(var1, var2); } final HashMap.Node<K, V> untreeify(HashMap<K, V> var1) { HashMap.Node var2 = null; HashMap.Node var3 = null; for(Object var4 = this; var4 != null; var4 = ((HashMap.Node)var4).next) { HashMap.Node var5 = var1.replacementNode((HashMap.Node)var4, (HashMap.Node)null); if (var3 == null) { var2 = var5; } else { var3.next = var5; } var3 = var5; } return var2; } final HashMap.TreeNode<K, V> putTreeVal(HashMap<K, V> var1, HashMap.Node<K, V>[] var2, int var3, K var4, V var5) { Class var6 = null; boolean var7 = false; HashMap.TreeNode var8 = this.parent != null ? this.root() : this; HashMap.TreeNode var9 = var8; HashMap.TreeNode var13; while(true) { int var11 = var9.hash; int var10; if (var9.hash > var3) { var10 = -1; } else if (var11 < var3) { var10 = 1; } else { Object var12 = var9.key; if (var9.key == var4 || var4 != null && var4.equals(var12)) { return var9; } if (var6 == null && (var6 = HashMap.comparableClassFor(var4)) == null || (var10 = HashMap.compareComparables(var6, var4, var12)) == 0) { if (!var7) { var7 = true; HashMap.TreeNode var14 = var9.left; if (var9.left != null && (var13 = var14.find(var3, var4, var6)) != null) { break; } var14 = var9.right; if (var9.right != null && (var13 = var14.find(var3, var4, var6)) != null) { break; } } var10 = tieBreakOrder(var4, var12); } } var13 = var9; if ((var9 = var10 <= 0 ? var9.left : var9.right) == null) { HashMap.Node var16 = var13.next; HashMap.TreeNode var15 = var1.newTreeNode(var3, var4, var5, var16); if (var10 <= 0) { var13.left = var15; } else { var13.right = var15; } var13.next = var15; var15.parent = var15.prev = var13; if (var16 != null) { ((HashMap.TreeNode)var16).prev = var15; } moveRootToFront(var2, balanceInsertion(var8, var15)); return null; } } return var13; } final void removeTreeNode(HashMap<K, V> var1, HashMap.Node<K, V>[] var2, boolean var3) { int var4; if (var2 != null && (var4 = var2.length) != 0) { int var5 = var4 - 1 & this.hash; HashMap.TreeNode var6 = (HashMap.TreeNode)var2[var5]; HashMap.TreeNode var7 = var6; HashMap.TreeNode var9 = (HashMap.TreeNode)this.next; HashMap.TreeNode var10 = this.prev; if (var10 == null) { var6 = var9; var2[var5] = var9; } else { var10.next = var9; } if (var9 != null) { var9.prev = var10; } if (var6 != null) { if (var7.parent != null) { var7 = var7.root(); } if (var7 != null && var7.right != null) { HashMap.TreeNode var8 = var7.left; if (var7.left != null && var8.left != null) { HashMap.TreeNode var12 = this.left; HashMap.TreeNode var13 = this.right; HashMap.TreeNode var14; HashMap.TreeNode var15; HashMap.TreeNode var16; if (var12 != null && var13 != null) { var15 = var13; while(true) { var16 = var15.left; if (var15.left == null) { boolean var17 = var15.red; var15.red = this.red; this.red = var17; HashMap.TreeNode var18 = var15.right; HashMap.TreeNode var19 = this.parent; if (var15 == var13) { this.parent = var15; var15.right = this; } else { HashMap.TreeNode var20 = var15.parent; if ((this.parent = var20) != null) { if (var15 == var20.left) { var20.left = this; } else { var20.right = this; } } if ((var15.right = var13) != null) { var13.parent = var15; } } this.left = null; if ((this.right = var18) != null) { var18.parent = this; } if ((var15.left = var12) != null) { var12.parent = var15; } if ((var15.parent = var19) == null) { var7 = var15; } else if (this == var19.left) { var19.left = var15; } else { var19.right = var15; } if (var18 != null) { var14 = var18; } else { var14 = this; } break; } var15 = var16; } } else if (var12 != null) { var14 = var12; } else if (var13 != null) { var14 = var13; } else { var14 = this; } if (var14 != this) { var15 = var14.parent = this.parent; if (var15 == null) { var7 = var14; } else if (this == var15.left) { var15.left = var14; } else { var15.right = var14; } this.left = this.right = this.parent = null; } var15 = this.red ? var7 : balanceDeletion(var7, var14); if (var14 == this) { var16 = this.parent; this.parent = null; if (var16 != null) { if (this == var16.left) { var16.left = null; } else if (this == var16.right) { var16.right = null; } } } if (var3) { moveRootToFront(var2, var15); } return; } } var2[var5] = var6.untreeify(var1); } } } final void split(HashMap<K, V> var1, HashMap.Node<K, V>[] var2, int var3, int var4) { HashMap.TreeNode var6 = null; HashMap.TreeNode var7 = null; HashMap.TreeNode var8 = null; HashMap.TreeNode var9 = null; int var10 = 0; int var11 = 0; HashMap.TreeNode var13; for(HashMap.TreeNode var12 = this; var12 != null; var12 = var13) { var13 = (HashMap.TreeNode)var12.next; var12.next = null; if ((var12.hash & var4) == 0) { if ((var12.prev = var7) == null) { var6 = var12; } else { var7.next = var12; } var7 = var12; ++var10; } else { if ((var12.prev = var9) == null) { var8 = var12; } else { var9.next = var12; } var9 = var12; ++var11; } } if (var6 != null) { if (var10 <= 6) { var2[var3] = var6.untreeify(var1); } else { var2[var3] = var6; if (var8 != null) { var6.treeify(var2); } } } if (var8 != null) { if (var11 <= 6) { var2[var3 + var4] = var8.untreeify(var1); } else { var2[var3 + var4] = var8; if (var6 != null) { var8.treeify(var2); } } } } static <K, V> HashMap.TreeNode<K, V> rotateLeft(HashMap.TreeNode<K, V> var0, HashMap.TreeNode<K, V> var1) { if (var1 != null) { HashMap.TreeNode var2 = var1.right; if (var1.right != null) { HashMap.TreeNode var4; if ((var4 = var1.right = var2.left) != null) { var4.parent = var1; } HashMap.TreeNode var3; if ((var3 = var2.parent = var1.parent) == null) { var0 = var2; var2.red = false; } else if (var3.left == var1) { var3.left = var2; } else { var3.right = var2; } var2.left = var1; var1.parent = var2; } } return var0; } static <K, V> HashMap.TreeNode<K, V> rotateRight(HashMap.TreeNode<K, V> var0, HashMap.TreeNode<K, V> var1) { if (var1 != null) { HashMap.TreeNode var2 = var1.left; if (var1.left != null) { HashMap.TreeNode var4; if ((var4 = var1.left = var2.right) != null) { var4.parent = var1; } HashMap.TreeNode var3; if ((var3 = var2.parent = var1.parent) == null) { var0 = var2; var2.red = false; } else if (var3.right == var1) { var3.right = var2; } else { var3.left = var2; } var2.right = var1; var1.parent = var2; } } return var0; } static <K, V> HashMap.TreeNode<K, V> balanceInsertion(HashMap.TreeNode<K, V> var0, HashMap.TreeNode<K, V> var1) { var1.red = true; while(true) { HashMap.TreeNode var2 = var1.parent; if (var1.parent == null) { var1.red = false; return var1; } if (!var2.red) { break; } HashMap.TreeNode var3 = var2.parent; if (var2.parent == null) { break; } HashMap.TreeNode var4 = var3.left; if (var2 == var3.left) { HashMap.TreeNode var5 = var3.right; if (var3.right != null && var5.red) { var5.red = false; var2.red = false; var3.red = true; var1 = var3; } else { if (var1 == var2.right) { var1 = var2; var0 = rotateLeft(var0, var2); var3 = (var2 = var2.parent) == null ? null : var2.parent; } if (var2 != null) { var2.red = false; if (var3 != null) { var3.red = true; var0 = rotateRight(var0, var3); } } } } else if (var4 != null && var4.red) { var4.red = false; var2.red = false; var3.red = true; var1 = var3; } else { if (var1 == var2.left) { var1 = var2; var0 = rotateRight(var0, var2); var3 = (var2 = var2.parent) == null ? null : var2.parent; } if (var2 != null) { var2.red = false; if (var3 != null) { var3.red = true; var0 = rotateLeft(var0, var3); } } } } return var0; } static <K, V> HashMap.TreeNode<K, V> balanceDeletion(HashMap.TreeNode<K, V> var0, HashMap.TreeNode<K, V> var1) { while(var1 != null && var1 != var0) { HashMap.TreeNode var2 = var1.parent; if (var1.parent == null) { var1.red = false; return var1; } if (var1.red) { var1.red = false; return var0; } HashMap.TreeNode var3 = var2.left; HashMap.TreeNode var5; HashMap.TreeNode var6; if (var2.left == var1) { HashMap.TreeNode var4 = var2.right; if (var2.right != null && var4.red) { var4.red = false; var2.red = true; var0 = rotateLeft(var0, var2); var2 = var1.parent; var4 = var1.parent == null ? null : var2.right; } if (var4 == null) { var1 = var2; } else { var5 = var4.left; var6 = var4.right; if (var6 != null && var6.red || var5 != null && var5.red) { if (var6 == null || !var6.red) { if (var5 != null) { var5.red = false; } var4.red = true; var0 = rotateRight(var0, var4); var2 = var1.parent; var4 = var1.parent == null ? null : var2.right; } if (var4 != null) { var4.red = var2 == null ? false : var2.red; var6 = var4.right; if (var4.right != null) { var6.red = false; } } if (var2 != null) { var2.red = false; var0 = rotateLeft(var0, var2); } var1 = var0; } else { var4.red = true; var1 = var2; } } } else { if (var3 != null && var3.red) { var3.red = false; var2.red = true; var0 = rotateRight(var0, var2); var2 = var1.parent; var3 = var1.parent == null ? null : var2.left; } if (var3 == null) { var1 = var2; } else { var5 = var3.left; var6 = var3.right; if ((var5 == null || !var5.red) && (var6 == null || !var6.red)) { var3.red = true; var1 = var2; } else { if (var5 == null || !var5.red) { if (var6 != null) { var6.red = false; } var3.red = true; var0 = rotateLeft(var0, var3); var2 = var1.parent; var3 = var1.parent == null ? null : var2.left; } if (var3 != null) { var3.red = var2 == null ? false : var2.red; var5 = var3.left; if (var3.left != null) { var5.red = false; } } if (var2 != null) { var2.red = false; var0 = rotateRight(var0, var2); } var1 = var0; } } } } return var0; } static <K, V> boolean checkInvariants(HashMap.TreeNode<K, V> var0) { HashMap.TreeNode var1 = var0.parent; HashMap.TreeNode var2 = var0.left; HashMap.TreeNode var3 = var0.right; HashMap.TreeNode var4 = var0.prev; HashMap.TreeNode var5 = (HashMap.TreeNode)var0.next; if (var4 != null && var4.next != var0) { return false; } else if (var5 != null && var5.prev != var0) { return false; } else if (var1 != null && var0 != var1.left && var0 != var1.right) { return false; } else if (var2 != null && (var2.parent != var0 || var2.hash > var0.hash)) { return false; } else if (var3 == null || var3.parent == var0 && var3.hash >= var0.hash) { if (var0.red && var2 != null && var2.red && var3 != null && var3.red) { return false; } else if (var2 != null && !checkInvariants(var2)) { return false; } else { return var3 == null || checkInvariants(var3); } } else { return false; } } } final class ValueIterator extends HashMap<K, V>.HashIterator implements Iterator<V> { ValueIterator() { super(); } public final V next() { return this.nextNode().value; } } static final class ValueSpliterator<K, V> extends HashMap.HashMapSpliterator<K, V> implements Spliterator<V> { ValueSpliterator(HashMap<K, V> var1, int var2, int var3, int var4, int var5) { super(var1, var2, var3, var4, var5); } public HashMap.ValueSpliterator<K, V> trySplit() { int var1 = this.getFence(); int var2 = this.index; int var3 = var2 + var1 >>> 1; return var2 < var3 && this.current == null ? new HashMap.ValueSpliterator(this.map, var2, this.index = var3, this.est >>>= 1, this.expectedModCount) : null; } public void forEachRemaining(Consumer<? super V> var1) { if (var1 == null) { throw new NullPointerException(); } else { HashMap var5 = this.map; HashMap.Node[] var6 = var5.table; int var3 = this.fence; int var4; if (this.fence < 0) { var4 = this.expectedModCount = var5.modCount; var3 = this.fence = var6 == null ? 0 : var6.length; } else { var4 = this.expectedModCount; } if (var6 != null && var6.length >= var3) { int var2 = this.index; if (this.index >= 0 && (var2 < (this.index = var3) || this.current != null)) { HashMap.Node var7 = this.current; this.current = null; do { do { if (var7 == null) { var7 = var6[var2++]; } else { var1.accept(var7.value); var7 = var7.next; } } while(var7 != null); } while(var2 < var3); if (var5.modCount != var4) { throw new ConcurrentModificationException(); } } } } } public boolean tryAdvance(Consumer<? super V> var1) { if (var1 == null) { throw new NullPointerException(); } else { HashMap.Node[] var3 = this.map.table; int var2; if (var3 != null && var3.length >= (var2 = this.getFence()) && this.index >= 0) { while(this.current != null || this.index < var2) { if (this.current != null) { Object var4 = this.current.value; this.current = this.current.next; var1.accept(var4); if (this.map.modCount != this.expectedModCount) { throw new ConcurrentModificationException(); } return true; } this.current = var3[this.index++]; } } return false; } } public int characteristics() { return this.fence >= 0 && this.est != this.map.size ? 0 : 64; } } final class Values extends AbstractCollection<V> { Values() { } public final int size() { return HashMap.this.size; } public final void clear() { HashMap.this.clear(); } public final Iterator<V> iterator() { return HashMap.this.new ValueIterator(); } public final boolean contains(Object var1) { return HashMap.this.containsValue(var1); } public final Spliterator<V> spliterator() { return new HashMap.ValueSpliterator(HashMap.this, 0, -1, 0, 0); } public final void forEach(Consumer<? super V> var1) { if (var1 == null) { throw new NullPointerException(); } else { if (HashMap.this.size > 0) { HashMap.Node[] var2 = HashMap.this.table; if (HashMap.this.table != null) { int var3 = HashMap.this.modCount; for(int var4 = 0; var4 < var2.length; ++var4) { for(HashMap.Node var5 = var2[var4]; var5 != null; var5 = var5.next) { var1.accept(var5.value); } } if (HashMap.this.modCount != var3) { throw new ConcurrentModificationException(); } } } } } } }