1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125
   | 
  public V put(K key, V value) {     return putVal(hash(key), key, value, false, true); }
 
  final V putVal(int hash, K key, V value, boolean onlyIfAbsent,                boolean evict) {     Node<K,V>[] tab; Node<K,V> p; int n, i;          if ((tab = table) == null || (n = tab.length) == 0)         n = (tab = resize()).length;          if ((p = tab[i = (n - 1) & hash]) == null)         tab[i] = newNode(hash, key, value, null);     else {         Node<K,V> e; K k;                  if (p.hash == hash &&             ((k = p.key) == key || (key != null && key.equals(k))))             e = p;                  else if (p instanceof TreeNode)             e = ((TreeNode<K,V>)p).putTreeVal(this, tab, hash, key, value);         else {                          for (int binCount = 0; ; ++binCount) {                 if ((e = p.next) == null) {                                          p.next = newNode(hash, key, value, null);                     if (binCount >= TREEIFY_THRESHOLD - 1)                                                   treeifyBin(tab, hash);                     break;                 }                 if (e.hash == hash &&                     ((k = e.key) == key || (key != null && key.equals(k))))                     break;                 p = e;             }         }                  if (e != null) {              V oldValue = e.value;                          if (!onlyIfAbsent || oldValue == null)                 e.value = value;                          afterNodeAccess(e);             return oldValue;         }     }     ++modCount;          if (++size > threshold)         resize();          afterNodeInsertion(evict);     return null; }
 
  Node<K,V> newNode(int hash, K key, V value, Node<K,V> e) {     LinkedHashMap.Entry<K,V> p =         new LinkedHashMap.Entry<K,V>(hash, key, value, e);     linkNodeLast(p);     return p; }
 
  private void linkNodeLast(LinkedHashMap.Entry<K,V> p) {     LinkedHashMap.Entry<K,V> last = tail;     tail = p;          if (last == null)         head = p;     else {                  p.before = last;         last.after = p;     } }
 
 
  void afterNodeAccess(Node<K,V> e) {      LinkedHashMap.Entry<K,V> last;     if (accessOrder && (last = tail) != e) {         LinkedHashMap.Entry<K,V> p =             (LinkedHashMap.Entry<K,V>)e, b = p.before, a = p.after;         p.after = null;         if (b == null)             head = a;         else             b.after = a;         if (a != null)             a.before = b;         else             last = b;         if (last == null)             head = p;         else {             p.before = last;             last.after = p;         }         tail = p;         ++modCount;     } }
 
  void afterNodeInsertion(boolean evict) {      LinkedHashMap.Entry<K,V> first;     if (evict && (first = head) != null && removeEldestEntry(first)) {         K key = first.key;                  removeNode(hash(key), key, null, false, true);     } }
 
  protected boolean removeEldestEntry(Map.Entry<K,V> eldest) {     return false; }
 
  |