0

假设我有一个HashMap()这样定义和分配的:

private HashMap<Integer, Integer> rankCombinator=new HashMap<>();

在访问 HashMap 之前,我总是使用键和值“构建”它,例如,我在其上存储 15 个整数作为键,它们具有我想要的对应值。我正在尝试使用 for-each 循环遍历此地图:

for(Map.Entry<Integer, Integer> entry : rankCombinator.entrySet())
{
   // More code here.
}

我想这个循环不会返回按照它们最初输入的方式排序的值。我对吗?如果是,返回的值中是否有任何模式?我试过查看文档,但它似乎没有包含此模式。

4

4 回答 4

4

HashMap实现不保证返回项目的顺序,我建议使用LinkedHashMap保留顺序。

private Map<Integer, Integer> rankCombinator=new LinkedHashMap<Integer, Integer>();

API 文档

于 2013-01-25T01:44:20.653 回答
1

简短的回答,不。来自javadoc:“此类不保证地图的顺序”

它是任意的,取决于哈希表中的桶数,以及桶中元素的顺序。因此,当重新哈希发生时,它会有所不同。

如果您需要基于插入顺序的可预测顺序,请使用LinkedHashMap 。

于 2013-01-25T01:47:48.723 回答
1

哈希映射根据键的哈希码将项目存储在“桶”中。“plain”HashMap返回条目,因为它在其“哈希桶”中找到它们。它没有可辨别的模式,即使你找到它,它也会严重依赖于实现并且不可靠。

如果您需要可靠的迭代顺序,请使用 a TreeMap(您将获得按键排序的条目)或LinkedHashMap(您将获得插入顺序)。请注意,它TreeMap具有不同的机制来确定其键的相等性,因此您可以使键具有可比性,或者在侧面提供一个比较器来处理键排序。

于 2013-01-25T01:48:10.100 回答
0

顺序是随机的,但由将对象分配到 hashmap 数组存储中的槽的散列函数确定。

更多信息在这里:哈希表是如何工作的?

于 2013-01-25T01:49:39.097 回答