实现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?
