我在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