Java HashMap <integer,... =“”> keyset()按排序顺序迭代

时间:2018-02-28 21:02:42

标签: java hashmap

这个问题只是出于好奇,但我注意到使用键集迭代HashMap似乎总是按排序顺序排列。显然,使用HashMaps永远不会保留插入顺序,但排序的键顺序对我来说似乎有点奇怪。使用这个例子:

    <form id="form">
    <label for="number">Guess number between 0-100: </label>
    <input id="number" type="text" name="number">
    <button type="submit">Guess</button>
    </form>
    <p id="lower"></p>
    <p id="higher"></p>
    <p id="hint"></p>
    <p id="numbers"></p>

    <script src="numbergame.js"></script>

输出:

import java.util.HashMap;

public class test {
    public static void main(String[] args) {
        HashMap<Integer, String> someMap = new HashMap<Integer, String>();

        someMap.put(0, "nothing");
        someMap.put(7, "nothing");
        someMap.put(3, "nothing");
        someMap.put(4, "nothing");
        someMap.put(10, "nothing");
        someMap.put(11, "nothing");
        someMap.put(2, "nothing");
        someMap.put(1, "nothing");
        someMap.put(5, "nothing");

        for (Integer someInt : someMap.keySet()) {
            System.out.println(someInt);
        }
    }
}

这是否可靠且一致?如果HashMap实现是一个数组,如果keyset只是遍历从0开始的所有可用数组索引,这将是有意义的,但我可能错了,它比这更复杂。

3 个答案:

答案 0 :(得分:2)

HashMapsHashSets期间不保证特定订单。您可以通过删除和添加一些元素来解除订单。

结帐:

import java.util.HashMap;

public class test {
    public static void main(String[] args) {
        HashMap<Integer, String> someMap = new HashMap<Integer, String>();

        someMap.put(0, "nothing");
        someMap.put(7, "nothing");
        someMap.put(3, "nothing");
        someMap.put(4, "nothing");
        someMap.put(10, "nothing");
        someMap.put(11, "nothing");
        someMap.put(2, "nothing");
        someMap.put(10004, "nothing");
        someMap.put(1, "nothing");
        someMap.put(5, "nothing");

        for (Integer someInt : someMap.keySet()) {
            System.out.println(someInt);
        }
    }
}

在大多数类型的散列集中,散列函数排除特定值的位置。

答案 1 :(得分:1)

来自javadoc

  

此课程不保证地图的顺序;特别是,它不保证订单会随着时间的推移保持不变。

您所看到的可能是关于JVM实现以及如何管理哈希码的巧合,或者可能(但不太可能):

  

请注意,使用具有相同hashCode()的许多键是降低任何哈希表性能的可靠方法。为了改善影响,当键是可比较的时,这个类可以使用键之间的比较顺序来帮助打破关系。

无论如何,这不可靠或不变。

答案 2 :(得分:1)

可能是这样;但由于它没有在java文档中记录,因此您不应该根据此类行为进行编码。由于新的Java版本可以更改public void run() { int h = 0; int t = 0; boolean wasHeads = false; boolean isHeads = false; int longest = 0; int streak = 0; int ih = 0; for (int i = 0; i < FLIPS; i++) { int coinFlip = Randomizer.nextInt(1, 2); if (coinFlip == 2) { //heads System.out.println("Heads"); if (wasHeads = true) { streak++; } else { streak = 0; } wasHeads = true; } else if(coinFlip == 1) { //tails System.out.println("Tails"); t++; isHeads = false; if (streak > longest){ longest = streak; } streak = 0; ih = 0; } } System.out.println("Longest streak of heads: " + longest); } 实现,这可能会提供非升序订单密钥;所以根据这种行为你所做的任何代码都会破坏