我在Java中有一个哈希图,需要限制其大小(50000的顺序)。但我应该只删除最旧的项目。该项目的时间戳存储在输入对象的字段中:

Map<String, MyModel> snapshot = new  HashMap<>();


public class MyModel {
    private ZonedDateTime createdAt;
    // other fields...
}

我还按该时间戳顺序将它们插入 map 。

完成此类最旧条目的删除的最有效方法是什么?请注意,时间“阈值”是未知的,只有 map 所需的最终大小是未知的。

最佳答案

HashMap没有“最旧的”,没有“第一”,没有顺序
另一方面,LinkedHashMap正是为此目的而设计的,它在条目之间维护了一个双向链接列表,以便保持它们的插入顺序,还提供了 removeEldestEntry 方法:

public static void main(final String args[]) throws Exception {
    final int maxSize = 4;
    final LinkedHashMap<String, String> cache = new LinkedHashMap<String, String>() {
        @Override
        protected boolean removeEldestEntry(final Map.Entry eldest) {
            return size() > maxSize;
        }
    };

    cache.put("A", "A");
    System.out.println(cache);
    cache.put("B", "A");
    System.out.println(cache);
    cache.put("C", "A");
    System.out.println(cache);
    cache.put("D", "A");
    System.out.println(cache);
    cache.put("E", "A");
    System.out.println(cache);
    cache.put("F", "A");
    System.out.println(cache);
    cache.put("G", "A");
}
输出:
{A=A}
{A=A, B=A}
{A=A, B=A, C=A}
{A=A, B=A, C=A, D=A}
{B=A, C=A, D=A, E=A}
{C=A, D=A, E=A, F=A}

大型健康警告

LinkedHashMap JavaDoc

08-08 01:01