question: V remove ( Object key , int hash , Object value ) { lock ( ) ; try { int c = count - 1 ; HashEntry < K , V > [ ] tab = table ; int index = hash & ( tab . length - 1 ) ; HashEntry < K , V > first = tab [ index ] ; HashEntry < K , V > e = first ; while ( e != null && ( e . hash != hash || ! key . equals ( e . key ) ) ) e = e . next ; V oldValue = null ; if ( e != null ) { V v = e . value ; if ( value == null || value . equals ( v ) ) { oldValue = v ; ++ modCount ; eviction . onEntryRemove ( e ) ; HashEntry < K , V > newFirst = e . next ; for ( HashEntry < K , V > p = first ; p != e ; p = p . next ) { eviction . onEntryRemove ( p ) ; newFirst = new HashEntry < K , V > ( p . key , p . hash , newFirst , p . value ) ; eviction . onEntryMiss ( newFirst ) ; } tab [ index ] = newFirst ; count = c ; } } return oldValue ; } finally { unlock ( ) ; } }
target:  Remove; match on key only if value null, else match both.