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();
  }
}

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 ( ) ; } }
remove ; match on key only if value null , else match both .
