V (final Object key) { final Entry<K, V>[] table = this.table; final int hash = hashKey((K)key); final int index = hash % table.length; Entry<K, V> e = table[index]; if (e == null) { return null; } K entryKey; if (e.keyHash == hash && ((entryKey = e.key) == key || hashingStrategy.isEqual(entryKey, (K)key))) { table[index] = e.hashNext; } else { for (; ;) { final Entry<K, V> last = e; e = e.hashNext; if (e == null) { return null; } if (e.keyHash == hash && ((entryKey = e.key) == key || hashingStrategy.isEqual(entryKey, (K)key))) { last.hashNext = e.hashNext; break; } } } unlink(e); size--; return e.value; }