Java 按顺序迭代HashMap

Java 按顺序迭代HashMap,java,collections,Java,Collections,我有一个HashMap 它有上亿次的观测 以键的数字顺序迭代HashMap元素的最佳方法是什么 我考虑过更改为TreeMap,但没有这样做,因为它实际上可能会增加创建映射的负载,因为TreeMap处于打开状态,HashMap是O1。您不能按顺序迭代HashMap。你必须用树形图来做这件事。如果使用LinkedHashMap,可以按键插入到映射中的顺序进行迭代,但除非按数字顺序插入键,否则仍然不是所需的顺序。如果插入顺序与键的顺序相同,则可以使用 哈希表和链表实现的映射接口,具有可预测的迭代顺序。

我有一个HashMap

它有上亿次的观测

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


我考虑过更改为TreeMap,但没有这样做,因为它实际上可能会增加创建映射的负载,因为TreeMap处于打开状态,HashMap是O1。

您不能按顺序迭代HashMap。你必须用树形图来做这件事。如果使用LinkedHashMap,可以按键插入到映射中的顺序进行迭代,但除非按数字顺序插入键,否则仍然不是所需的顺序。

如果插入顺序与键的顺序相同,则可以使用

哈希表和链表实现的映射接口,具有可预测的迭代顺序。此实现与HashMap的不同之处在于,它维护一个贯穿其所有条目的双链接列表。此链表定义了迭代顺序,通常是将关键帧插入贴图插入顺序的顺序。请注意,如果将键重新插入地图,则插入顺序不受影响。如果m.putk,v在m.containsKeyk将在调用之前立即返回true时被调用,则将密钥k重新插入到映射m中


在Java 8中,您可以使用类似以下内容:

import static java.util.Comparator.comparing;

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

这显然需要对未排序的键进行排序,这将是有代价的。因此,您需要决定是要使用树形图提前支付成本,还是在需要时继续使用HashMap。

这个问题相当复杂:1 HashMap无序;你可能需要树形图或创建自己的结构。在一个系统中,数亿个观测值可能会耗尽你的内存。在选择数据结构时,考虑最常用的操作,并对这些情况进行优化。请记住,除非您的数据已经排序,否则您将永远无法获得排序1键是连续的数字吗?如果没有,那么你就必须做一些排序工作,不管怎样都要花钱。你想要一个LinkedHashMap。请看这里:谢谢-不幸的是,它们不是按自然顺序插入的。谢谢。。。这看起来是一个可行的解决方案。我对两者都进行了评估,看起来TreeMap的性能并没有太大的影响,所以最终使用了它。