docs: @Override
      public boolean containsValue(Object value) {
          if (value == null) {
              throw new NullPointerException();
          }
  
          for (Map.Entry<K, CachedValue<K, V>> entry : map.entrySet()) {
              CachedValue<K, V> cachedValue = entry.getValue();
              if (cachedValue.getValue().equals(value)) {
                  if (isValueExpired(cachedValue)) {
                      if (map.remove(cachedValue.getKey(), cachedValue)) {
                          onValueRemove(cachedValue);
                      }
                  } else {
                      readValue(cachedValue);
                      return true;
                  }
              }
          }
          return false;
      }