V (final long key, final @NotNull V value) { final Entry<V>[] table = this.table; final int hash = hashCode(key); final int index = hash % table.length; for (Entry<V> e = table[index]; e != null; e = e.hashNext) { if (e.keyHash == hash && e.key == key) { moveToTop(e); return e.setValue(value); } } final Entry<V> e = new Entry<>(key, value, hash); e.hashNext = table[index]; table[index] = e; final Entry<V> top = this.top; e.next = top; if (top != null) { top.previous = e; } else { back = e; } this.top = e; size++; if (removeEldestEntry(back)) { doRemoveEldestEntry(); } else if (size > capacity) { rehash((int)(capacity * HashUtil.CAPACITY_MULTIPLE)); } return null; }