是否保证标准实现中的键和值以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)
从 的文档HashMap,
此类不保证地图的顺序;特别是,它不保证订单会随着时间的推移保持不变。
如果你查看它的代码,你会发现一旦调用put(),最终会hash被计算、entry object创建并添加到bucket array. 我已经过度简化了代码的目的,只是为了解释幕后发生的事情。
如果您想要有保证的订单,请使用LinkedHashMap或TreeMap根据您的要求
还要检查,
HashMap、LinkedHashMap 和 TreeMap 的区别