按顺序迭代 HashMap

Iterating HashMap in order

我有一个 HashMap。

它有数以百万计的观测值。

按键的数字顺序迭代 HashMap 元素的最佳方法是什么?

我考虑过改用 TreeMap,但没有这样做,因为它实际上可能会增加创建 Map 的负载(因为 TreeMap 是 O(n),HashMap 是 O(1))。

您不能按顺序迭代 HashMap。为此,您必须使用 TreeMap。如果您使用 LinkedHashMap,您可以按照键插入到 Map 的顺序进行迭代,但它仍然不是您想要的(除非您按数字顺序插入键)。

如果您的插入顺序与密钥的顺序相同,那么您可以使用 LinkedHashMap

Hash table and linked list implementation of the Map interface, with predictable iteration order. This implementation differs from HashMap in that it maintains a doubly-linked list running through all of its entries. This linked list defines the iteration ordering, which is normally the order in which keys were inserted into the map (insertion-order). Note that insertion order is not affected if a key is re-inserted into the map. (A key k is reinserted into a map m if m.put(k, v) is invoked when m.containsKey(k) would return true immediately prior to the invocation.)

对于 Java 8,您可以使用类似于以下内容的内容:

import static java.util.Comparator.comparing;

map.entrySet().stream()
   .sorted(comparing(Entry::getKey))
   .forEach(e -> doSomethingWithTheEntry(e));

这显然涉及对未排序的键进行排序,这是有代价的。因此,您需要决定是要使用 TreeMap 预先支付费用,还是在需要时继续使用 HashMap。