public V put(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;
  }
public V put(final long key, final @NotNull V value)