首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >LinkedHashSet实现LRU

LinkedHashSet实现LRU
EN

Stack Overflow用户
提问于 2013-06-22 21:39:30
回答 2查看 6.2K关注 0票数 11

我想删除LinkedHashSet中最古老的成员,我知道有一个removeEldestEntry方法必须重写(Java for removeEldestEntry),但我想我必须定义initial capacityload factor,我不在乎,我只是想删除最近访问过的元素(在这里,access指的是在集合中或正在读取的时候是put )。

有没有办法不覆盖removeEldestEntry

EN

回答 2

Stack Overflow用户

发布于 2013-06-22 22:10:52

我知道有一个removeEldestEntry方法,我必须重写

这句话是错误的,因为LinkedHashSet 有-A而不是-A.

您可以使用有用的(尽管不是众所周知的) Collections.newSetFromMap方法:

代码语言:javascript
复制
Set<String> mySet = Collections.newSetFromMap(new LinkedHashMap<String, Boolean>(){
    protected boolean removeEldestEntry(Map.Entry<String, Boolean> eldest) {
        return size() > MAX_ENTRIES;
    }
});

因此,它将返回实现自定义Set方法的LinkedHashMap (一个类似集合的接口)的LinkedHashMap远景。

MAX_ENTRIES是您应该定义的自定义常量。

票数 32
EN

Stack Overflow用户

发布于 2022-09-27 19:52:39

对上述答案略加改进:

代码语言:javascript
复制
    Collections.newSetFromMap(new LinkedHashMap<T, Boolean>(maxSize, 0.75f, true) {  

      @Override
      public boolean containsKey(Object key) {
       // Unfortunately, the LinkedHashMap containsKey method doesn't reset the LRU order, 
       // so perform a 'get' call here too
        return super.containsKey(key)
                && super.get(key); 
      }

      @Override
      protected boolean removeEldestEntry(Map.Entry<T, Boolean> eldest) {
        return this.size() > maxSize;
      }
    });
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17255572

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档