public V remove(K key) {
   if (map.containsKey(key)) {
     V value = map.remove(key);
     unmanage(key, value);
     return value;
   } else {
     return null;
   }
 }
  public void put(K key, V value) {
    // First, remove from map if it exists
    if (map.containsKey(key)) {
      V oldValue = map.remove(key);
      unmanage(key, oldValue);
    }

    // Add to map
    map.put(key, value);
    manage(key, value);

    // If an eldest element was removed, update byte count
    Map.Entry<K, V> eldestRemoved = map.getAndClearEldestRemoved();
    if (eldestRemoved != null) {
      unmanage(eldestRemoved);
    }

    // Now remove elements until byte count is under the threshold
    if (numBytesCapacity >= 0) {
      while (numManagedBytes > numBytesCapacity && map.size() > 0) {
        Iterator<Map.Entry<K, V>> iterator = map.entrySet().iterator();
        Map.Entry<K, V> eldest = iterator.next();
        unmanage(eldest);
        iterator.remove();
      }
    }
  }
 public int size() {
   return map.size();
 }
 public V get(K key) {
   return map.get(key);
 }