code: public boolean put(K key, V value) {
  	boolean added = super.put(key, value);
  	if (isKeyBound) {
  	    if (size() > bound) {
  		remove(firstKey());
  	    } 
  	}
  	else if (range() > bound) {
  	    K first = firstKey();
  	    Set<V> values = get(first);
  	    // Arbitrarily remove the first key in the set.  Note that the set
  	    // is guaranteed to be non-empty, so the iterator call to next()
  	    // will always succeed.
  	    int elementToRemove = 0;
  	    if (isFair) {
  		elementToRemove = (int)(Math.random() * values.size());
  		V toRemove = null;
  		Iterator<V> it = values.iterator();
  		for (int i = 0; i <= elementToRemove; ++i) {
  		    toRemove = it.next();
  		}
  		remove(first, toRemove);
  	    }
  	    else {
  		remove(first, values.iterator().next());
  	    }
  	}
  	return added;
      }
docs: Adds the key-value mapping to this map, and if the total number of
  mappings exceeds the bounds, removes either the currently lowest element,
  or if reversed, the currently highest element.  If this map is bound by
  the number of keys, a {@code put} operation may result in the {@code
  range} decreasing, even though the number of keys stays constant.
  
  @param key {@inheritDoc}
  @param value {@inheritDoc}