你们知道Java Map或类似的标准数据存储在给定的超时后自动清除条目吗?这意味着老化,旧的过期条目会自动"老化".

最好是在可以通过Maven访问的开源库中?

我自己知道实现该功能的方法,并且在过go 已经实现了几次,所以我不是在征求这方面的建议,而是向您寻求一个好的参考实现的指导.

基于WeakReference的解决方案(如WeakHashMap)不是一个选项,因为我的密钥可能是非内部字符串,并且我想要一个不依赖于垃圾收集器的可配置超时.

Ehcache也是一个我不想依赖的选项,因为它需要外部配置文件.我正在寻找一种仅限代码的解决方案.

推荐答案

对谷歌Collection (Google Collections,简称Guava)现在有一个叫做MapMaker的东西可以做到这一点.

ConcurrentMap<Key, Graph> graphs = new MapMaker()
   .concurrencyLevel(4)
   .softKeys()
   .weakValues()
   .maximumSize(10000)
   .expiration(10, TimeUnit.MINUTES)
   .makeComputingMap(
       new Function<Key, Graph>() {
         public Graph apply(Key key) {
           return createExpensiveGraph(key);
         }
       });

Update:

自guava 10.0(2011年9月28日发布)起,许多 map 制作方法已被弃用,取而代之的是新的CacheBuilder:

LoadingCache<Key, Graph> graphs = CacheBuilder.newBuilder()
    .maximumSize(10000)
    .expireAfterWrite(10, TimeUnit.MINUTES)
    .build(
        new CacheLoader<Key, Graph>() {
          public Graph load(Key key) throws AnyException {
            return createExpensiveGraph(key);
          }
        });

Java相关问答推荐

查找最大子数组的和

如何在Docker容器中使用wireock—Webhooks阻止请求?

根据对象和值的参数将映射<;T、值&>转换为列表<;T&>

需要一个找不到的jakarta.sistence.EntityManager类型的Bean

流迭代列表<;对象>;上的NoSuchElementException

如何确定springboot在将json字段转换为Dto时如何处理它?

我不能再在Android Studio Hedgehog上用Java语言创建新项目了吗?

用户填充的数组列表永不结束循环

如何从日志(log)行中删除包名称?

在Java中将int[]矩阵添加到ArrayList中,但出现错误

try 使用类来包含JSON响应

如何使用MapStrCut转换双向链接

向Java进程发送`kill-11`会引发NullPointerException吗?

为什么这种递归会有这样的行为?

记录是类的语法糖吗?

本机方法(JNI)总是编译的吗?

为什么创建Java动态代理需要接口参数

在WHILE()循环初始化部分中声明和初始化变量的Java语法?

将天数添加到ZonedDateTime不会更改时间

Spring Integration SFTP 连接失败 - 无法协商 kex 算法的密钥交换