@Override
    public V put( K key, V value )
    {
        V existingValue = null;
        
        // Check for key in map, else check for value
        
        if( mapKV.containsKey( key ) )
        {
            // Get existing value for key
            
            existingValue = mapKV.get( key );
            
            // Return if key-value pair exists in map
            
            if( value == existingValue || ( value != null && value.equals( existingValue ) ) )
            {
                return existingValue;
            }
            
            // Remove existing value-key mapping
            
            mapVK.remove( existingValue );
            
            // Update value hash code
            
            if( existingValue != null )
            {
                vHash -= existingValue.hashCode();
            }
        }
        else if( mapVK.containsKey( value ) )
        {
            // Get existing key for value
            
            K existingKey = mapVK.get( value );
            
            // Remove existing key-value mapping
            
            mapKV.remove( existingKey );
            
            // Update key hash code
            
            if( existingKey != null )
            {
                kHash -= existingKey.hashCode();
            }
        }
        
        // Add new mappings
        
        mapKV.put( key, value );
        mapVK.put( value, key );
        
        // Update hash codes
        
        if( key != null )
        {
            kHash += key.hashCode();
        }
        
        if( value != null )
        {
            vHash += value.hashCode();
        }
        
        // Return previously mapped value
        
        return existingValue;
    }