V remove(Object key,int hash,Object value){
  lock();
  try {
    int c=count - 1;
    IHashEntry<K,V>[] tab=table;
    int index=hash & (tab.length - 1);
    IHashEntry<K,V> first=tab[index];
    IHashEntry<K,V> e=first;
    while (e != null && (_h.hash(e) != hash || !key.equals(_h.key(e))))     e=_h.next(e);
    V oldValue=null;
    if (e != null) {
      V v=_h.value(e);
      if (value == null || value.equals(v)) {
        oldValue=v;
        ++modCount;
        IHashEntry<K,V> newFirst=_h.next(e);
        for (IHashEntry<K,V> p=first; p != e; p=_h.next(p))         newFirst=_h.cloneEntry(p,newFirst);
        tab[index]=newFirst;
        count=c;
      }
    }
    return oldValue;
  }
  finally {
    unlock();
  }
}

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