Java 我应该使用哪种数据结构来支持键值映射、反向迭代和插入顺序?

Java 我应该使用哪种数据结构来支持键值映射、反向迭代和插入顺序?,java,collections,hashmap,treemap,linkedhashmap,Java,Collections,Hashmap,Treemap,Linkedhashmap,集合中的哪个数据结构可以有效地存储键值映射、保留插入顺序并允许有效的反向遍历?数据结构必须来自原始Java集合,因此使用ApacheCommons库是不可能的 我目前使用的是LinkedHashMap,它非常理想,因为它保留了插入顺序,允许键值映射,并且具有在O(1)时间内操作的add()和remove()方法。然而,问题是,要反转LinkedHashMap,我需要在每次添加新密钥时执行设置副本: List<Integer> reverseKeys = new ArrayList&l

集合中的哪个数据结构可以有效地存储键值映射、保留插入顺序并允许有效的反向遍历?数据结构必须来自原始Java集合,因此使用ApacheCommons库是不可能的

我目前使用的是LinkedHashMap,它非常理想,因为它保留了插入顺序,允许键值映射,并且具有在O(1)时间内操作的add()和remove()方法。然而,问题是,要反转LinkedHashMap,我需要在每次添加新密钥时执行设置副本:

List<Integer> reverseKeys = new ArrayList<>(keys);
Collections.reverse(reverseKeys);
List reverseKeys=新数组列表(键);
收藏。反向(反向);
这在大型密钥集上变得非常昂贵(如本文所述:)

或者,我可以使用带有自定义比较器的树映射来保留插入顺序,但这似乎是一种浪费,因为add()和remove()将在O(n)时间内运行。这种方法的好处是树映射具有degendingKeyset()方法,这将允许高效的反向遍历

我唯一的另一个想法是使用Entry对象的ArrayList,但是我不确定这会有多高效


在几千个键值映射中,这些方法中哪一种总体性能最好?是否有我没有列出的更好的替代方法?

是否只有一个变量?如果您想经常查询相同的数据,通常的做法是在不同的结构中多次使用相同的数据

添加/删除的成本更高,但是选择的成本可以低很多

在您的例子中,可以将LinkedList按相反的顺序(在零位置添加是O(1))和LinkedHashMap


理想情况下,您应该使用这两个变量和方法(如“添加/删除等”)创建自己的类,以确保其一致性。

TreeMap
将是我的方法。几千个条目相对较小,我不会担心添加/删除的O(n)性能。只需添加到这个答案中,您就可以将它们都包装在一个新的数据结构中,通过一个公共接口来完成拥有和更新这两个条目的肮脏工作。它看起来不太优雅,但它确实完成了任务,满足了我的效率要求。谢谢