实现Map并保持插入顺序的Java类?
我正在寻找一个具有键值关联的java类,但不使用散列。 这是我目前正在做的事情:
Hashtable
。 Hashtable.entrySet()
的迭代器。 Map.Entry
。 Module
(一个自定义类)类型的对象。 问题在于我无法控制返回值的顺序,因此无法按给定顺序显示值(不对订单进行硬编码)。
我会为此使用ArrayList
或Vector
,但后来在代码中,我需要为给定的Key获取Module
对象,而我无法使用ArrayList
或Vector
。
有谁知道一个免费/开源的Java类可以做到这一点,或者是一种基于何时添加值从Hashtable
获取值的方法?
谢谢!
我建议一个LinkedHashMap
或一个TreeMap
。 一个LinkedHashMap
按照它们被插入的顺序保存这些键,而一个TreeMap
通过一个Comparator
或者元素的自然Comparable
排序保持排序。
由于不需要保持元素的排序,所以在大多数情况下, LinkedHashMap
应该更快; 根据Javadocs, TreeMap
对containsKey
, get
, put
和remove
具有O(log n)
性能,而LinkedHashMap
对每个都是O(1)
。
如果您的API仅仅需要可预测的排序顺序,而不是特定的排序顺序,请考虑使用这两个类实现的接口, NavigableMap
或SortedMap
。 这将允许您不要将特定的实现泄露到您的API中,然后切换到这些特定的类中,或者随意切换到完全不同的实现。
如果一张不可变的地图符合你的需求,那么谷歌有一个名为番石榴的图书馆(另请参阅番石榴问题)
Guava提供了一个具有可靠的用户指定迭代顺序的ImmutableMap。 这个ImmutableMap对于containsKey,get具有O(1)性能。 显然放和删除不支持。
ImmutableMap对象通过使用()和copyOf()或Builder对象的优雅静态便利方法来构造。
你可以维护一个Map
(用于快速查找)和List
(用于顺序),但是LinkedHashMap
可能是最简单的。 你也可以尝试一个SortedMap
例如TreeMap
,它有你指定的任何顺序。
上一篇: Java Class that implements Map and keeps insertion order?