Java中是否存在类似Map的对象,用于存储和访问键/值对,但可以返回键的有序列表和值的有序列表,这样键和值列表的顺序是相同的?

因此,作为代码解释,我正在寻找一些行为类似于我虚构的OrderedMap的东西:

OrderedMap<Integer, String> om = new OrderedMap<>();
om.put(0, "Zero");
om.put(7, "Seven");

String o = om.get(7); // o is "Seven"
List<Integer> keys = om.getKeys();
List<String> values = om.getValues();

for(int i = 0; i < keys.size(); i++)
{
    Integer key = keys.get(i);
    String value = values.get(i);
    Assert(om.get(key) == value);
}

当前回答

博士tl;

要保持Map< Integer, String >按键排序,使用实现SortedMap/NavigableMap接口的两个类之一:

TreeMap ConcurrentSkipListMap

或者第三方实现。也许在谷歌番石榴或Eclipse集合(我没有检查)。

如果在单个线程中操作映射,请使用第一个TreeMap。如果跨线程操作,则使用第二个ConcurrentSkipListMap。

详细信息请参见下表和下面的讨论。

细节

下面是我制作的一个图形表,展示了与Java 11捆绑在一起的10个Map实现的特性。

NavigableMap接口是SortedMap的继承者。SortedMap逻辑上应该删除,但不能删除,因为一些第三方映射实现可能正在使用接口。

正如你在这个表中看到的,只有两个类实现了SortedMap/NavigableMap接口:

TreeMap ConcurrentSkipListMap

这两种方法都按顺序保存键,或者按照它们的自然顺序(使用Comparable(https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/lang/Comparable.html)接口的compareTo方法),或者通过传递的Comparator实现。这两个类之间的区别在于第二个类ConcurrentSkipListMap是线程安全的、高度并发的。

另请参见下表中的迭代顺序列。

LinkedHashMap类按照条目最初被插入的顺序返回它们。 EnumMap按定义键的枚举类的顺序返回条目。例如,哪个员工负责一周中的哪一天的地图(map < DayOfWeek, Person >)使用Java中内置的DayOfWeek枚举类。该枚举定义为星期一的第一个和星期天的最后一个。所以迭代器中的条目会按照这个顺序出现。

其他六个实现没有承诺它们报告条目的顺序。

其他回答

自Java 6以来,也有非阻塞线程安全的TreeMap替代方案。 看到ConcurrentSkipListMap。

我认为SortedMap接口强制执行您所要求的,而TreeMap实现了它。

http://java.sun.com/j2se/1.5.0/docs/api/java/util/SortedMap.html http://java.sun.com/j2se/1.5.0/docs/api/java/util/TreeMap.html

博士tl;

要保持Map< Integer, String >按键排序,使用实现SortedMap/NavigableMap接口的两个类之一:

TreeMap ConcurrentSkipListMap

或者第三方实现。也许在谷歌番石榴或Eclipse集合(我没有检查)。

如果在单个线程中操作映射,请使用第一个TreeMap。如果跨线程操作,则使用第二个ConcurrentSkipListMap。

详细信息请参见下表和下面的讨论。

细节

下面是我制作的一个图形表,展示了与Java 11捆绑在一起的10个Map实现的特性。

NavigableMap接口是SortedMap的继承者。SortedMap逻辑上应该删除,但不能删除,因为一些第三方映射实现可能正在使用接口。

正如你在这个表中看到的,只有两个类实现了SortedMap/NavigableMap接口:

TreeMap ConcurrentSkipListMap

这两种方法都按顺序保存键,或者按照它们的自然顺序(使用Comparable(https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/lang/Comparable.html)接口的compareTo方法),或者通过传递的Comparator实现。这两个类之间的区别在于第二个类ConcurrentSkipListMap是线程安全的、高度并发的。

另请参见下表中的迭代顺序列。

LinkedHashMap类按照条目最初被插入的顺序返回它们。 EnumMap按定义键的枚举类的顺序返回条目。例如,哪个员工负责一周中的哪一天的地图(map < DayOfWeek, Person >)使用Java中内置的DayOfWeek枚举类。该枚举定义为星期一的第一个和星期天的最后一个。所以迭代器中的条目会按照这个顺序出现。

其他六个实现没有承诺它们报告条目的顺序。

SortedMap接口(带有TreeMap实现)应该是您的朋友。

接口有如下方法:

keySet()返回一组按升序排列的键 Values()返回所有值的集合,按相应键的升序排列

所以这个接口完全满足了您的要求。但是,键必须有一个有意义的顺序。否则,您可以使用LinkedHashMap,其中的顺序由插入顺序决定。

我认为您从框架中得到的最接近的集合是SortedMap