java.util.HashMap.values() 的迭代顺序

Vyt*_*nis 4 java

是否保证标准实现中的键和值以java.util.Map相同的顺序返回?例如,如果 map 包含映射x1 -> y1and x2 -> y2,那么如果keySet()迭代产生x1, x2,是否保证values()迭代会产生y1, y2而不是y2, y1?我没有看到任何地方保证这是真的,但它似乎有效。谁能给出证实或否认这个前提并给出反例?

public class MapsTest {
    @Test
    public void hashMapKeysAndValuesAreInSameOrder() {
        assertKeysAndValuesAreInSameOrder(new HashMap<>());
    }

    @Test
    public void treeMapKeysAndValuesAreInSameOrder() {
        assertKeysAndValuesAreInSameOrder(new TreeMap<>());
    }

    private void assertKeysAndValuesAreInSameOrder(Map<Integer, Integer> map) {
        Random random = new Random();
        IntStream.range(0, 100000).map(i -> random.nextInt()).forEach(i -> map.put(i, i));
        assertEquals(new ArrayList<>(map.keySet()), new ArrayList<>(map.values()));
    }
}
Run Code Online (Sandbox Code Playgroud)

sam*_*sam 5

从 的文档HashMap

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

如果你查看它的代码,你会发现一旦调用put(),最终会hash被计算、entry object创建并添加到bucket array. 我已经过度简化了代码的目的,只是为了解释幕后发生的事情。

如果您想要有保证的订单,请使用LinkedHashMapTreeMap根据您的要求

还要检查,

HashMap、LinkedHashMap 和 TreeMap 的区别