我知道 LinkedHashMap 提供了一个构造函数,您可以在其中指定地图是否应按访问顺序排序,从而有效地提供 LRU 实现。请问哪些(如果有的话)大型集合和映射提供此功能?
我认为不存在这样的集合或映射(但我刚刚第一次听说那个构造函数)。 我已经检查过 Guava,但我认为它们也没有解决方案。
但我认为可以使用装饰器模式轻松实现。编写一个委托对象,实现您想要的接口,并将所有方法委托给内部对象。 您的包装器还包含一个LinkedHashSet / LinkedHashMap(取决于您是处理集合还是映射),用于记录数据访问。
现在,您的iterator() / entrySet() 方法提供了一个视图,其首先由LinkedHashSet / Map支持,然后由其余数据支持(如果您想要反向访问顺序,则相反)。
我会使用类似Collections类中的包装器方法来实现它。
例如:
Map<String,String> map = CollectionUtils.viewMapByAccessOrder(
new HashMap<String,String>());
List<String> list = CollectionUtils.viewListByAccessOrder(
new ArrayList<String>());
这实际上可能是适用于更大受众的功能。我建议在Guava项目中提交一个功能请求。
Collections.newSetFromMap()
。 - Joachim Sauer