在 Java 8 上的 JUnit 中断言两个 LinkedHashMap 相等且顺序相同

问题描述 投票:0回答:1

我需要检查两个

LinkedHashMap
值的完全相等,包括它们的顺序。

@Test
public void test(){
    Map<String, Integer> actual = new LinkedHashMap<>();
    actual.put("longer", 1);
    actual.put("first", 1);
    actual.put("thebiggest", 1);
            
    Map<String, Integer> expected = new LinkedHashMap<>();
    expected.put("thebiggest", 1);
    expected.put("longer", 1);
    expected.put("first", 1);

    System.out.println("===expected");
    expected.entrySet().stream().forEach(n->System.out.println(n.getKey()));
    System.out.println("===actual");
    actual.entrySet().stream().forEach(n->System.out.println(n.getKey()));
    
    assertEquals(expected, actual);
    assertTrue(expected.equals(actual));
}

所有测试均通过,控制台输出:

===expected
thebiggest
longer
first
===actual
longer
first
thebiggest

文档中到处都写着

LinkedHashMap
保持插入顺序。那么为什么两个相同但不同的有序映射的断言会给出 true 呢?

如果平等顺序很重要,我应该采取什么地图?

java junit
1个回答
5
投票

equals

对于
Map
定义是它们具有相同的条目集,无论顺序如何。

比较指定对象与此映射是否相等。如果给定对象也是一个映射并且两个映射表示相同的映射,则返回 true。更正式地说,如果 m1.entrySet().equals(m2.entrySet()),则两个映射 m1 和 m2 表示相同的映射。这可以确保 equals 方法在 Map 接口的不同实现中正常工作。

如果您想断言相同的迭代顺序,您可以将两个迭代复制到列表中并比较列表。

© www.soinside.com 2019 - 2024. All rights reserved.