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