I've found a bug in the StaticBucketMap class, the remove(Object) method: /** * Implements {@link Map#remove(Object)}. */ public Object remove( Object key ) { int hash = getHash( key );
synchronized( m_locks[ hash ] ) { Node n = m_buckets[ hash ]; Node prev = null; while( n != null ) { HERE>>>>>>>>> if( n.key == null || ( n.key != null && n.key.equals( key ) ) ) <<<<<<<<<<<<<<<<<< { // Remove this node from the linked list of nodes. if( null == prev ) { // This node was the head, set the next node to be the new head. m_buckets[ hash ] = n.next; } else { // Set the next node of the previous node to be the node after this one. prev.next = n.next; } m_locks[hash].size--; return n.value; } prev = n; n = n.next; } } return null; } The test is: if( n.key == null || ( n.key != null && n.key.equals( key ) ) ) should be: if( n.key == key || ( n.key != null && n.key.equals( key ) ) ) which is how it works in get(Object), containsKey(Object) etc. and which is correct. We have a match if the keys match using == OR if they are equal according to equals(). /LS --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]