【发布时间】:2016-01-18 08:42:18
【问题描述】:
是否保证java.util.Map 的标准实现中的键和值以相同的顺序返回?例如,如果map包含映射x1 -> y1和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()));
}
}
【问题讨论】:
-
我认为你不能依赖它,因为
values()的文档没有提到这一点。 -
我猜这个功能是公共合同的一部分,尽管它没有记录在案。顺便说一句,我只记得 Linus Torvald 的帖子“我们从不破坏用户空间”。
标签: java