【问题标题】:How does Map.entrySet() traverse a hashMapMap.entrySet() 如何遍历一个hashMap
【发布时间】:2013-01-25 01:42:21
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 你的意思是Map.entrySet()

标签: java foreach hashmap traversal


【解决方案1】:

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

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

Api Documentation

【讨论】:

  • 哦,我没注意到,我只知道链表。感谢您指出了这一点。你对我的问题以及关于模式的问题也有答案吗?主要是出于好奇...
  • HashMap 实现不保证返回项目的顺序。所以真的没有模式。
【解决方案2】:

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

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

如果您需要基于广告订单的可预测订单,请使用 LinkedHashMap

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

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

      在此处了解更多信息:How does a hash table work?

      【讨论】:

        猜你喜欢
        • 2012-10-16
        • 2022-01-16
        • 2011-10-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-11-07
        • 1970-01-01
        相关资源
        最近更新 更多