in src/main/java/org/apache/commons/collections4/map/ConcurrentReferenceHashMap.java [1015:1054]
private V removeInternal(final Object key, final int hash, final Object value, final boolean refRemove) {
if (!refRemove) {
removeStale();
}
int c = count - 1;
final HashEntry<K, V>[] tab = table;
final int index = hash & tab.length - 1;
final HashEntry<K, V> first = tab[index];
HashEntry<K, V> e = first;
// a ref remove operation compares the Reference instance
while (e != null && key != e.keyRef && (refRemove || hash != e.hash || !keyEq(key, e.key()))) {
e = e.next;
}
V oldValue = null;
if (e != null) {
final V v = e.value();
if (value == null || value.equals(v)) {
oldValue = v;
// All entries following removed node can stay
// in list, but all preceding ones need to be
// cloned.
++modCount;
HashEntry<K, V> newFirst = e.next;
for (HashEntry<K, V> p = first; p != e; p = p.next) {
final K pKey = p.key();
// Skip GC'd keys
if (pKey == null) {
c--;
continue;
}
newFirst = newHashEntry(pKey, p.hash, newFirst, p.value());
}
tab[index] = newFirst;
// write-volatile
count = c;
}
}
return oldValue;
}