public V remove(K key) {
    Entry<K, V>[] entries = this.entries;
    int hash = hashKey(key);
    int index = hash & mask;
    Entry<K, V> e = entries[index];
    if (e == null) {
      return null;
    }

    K entryKey;
    if (e.keyHash == hash && ((entryKey = e.key) == key || hashingStrategy.isEqual(entryKey, key))) {
      entries[index] = e.hashNext;
    }
    else {
      for (; ; ) {
        Entry<K, V> last = e;
        e = e.hashNext;
        if (e == null) {
          return null;
        }
        if (e.keyHash == hash && ((entryKey = e.key) == key || hashingStrategy.isEqual(entryKey, key))) {
          last.hashNext = e.hashNext;
          break;
        }
      }
    }
    unlink(e);
    size--;
    return e.value;
  }
public V remove(K key)