考虑以下SSCCE:
public static void main(String[] args) {
LinkedHashSet<String> set1 = new LinkedHashSet<>();
set1.add("Bob");
set1.add("Tom");
set1.add("Sam");
LinkedHashSet<String> set2 = new LinkedHashSet<>();
set2.add("Sam");
set2.add("Bob");
set2.add("Tom");
System.out.println(set1);
System.out.println(set2);
System.out.println(set1.equals(set2));
}
Run Code Online (Sandbox Code Playgroud)
这打印:
[Bob, Tom, Sam]
[Sam, Bob, Tom]
true
Run Code Online (Sandbox Code Playgroud)
然而,如果你LinkedHashSet改为LinkedList:
public static void main(String[] args) {
LinkedList<String> set1 = new LinkedList<>();
set1.add("Bob");
set1.add("Tom");
set1.add("Sam");
LinkedList<String> set2 = new LinkedList<>();
set2.add("Sam");
set2.add("Bob");
set2.add("Tom");
System.out.println(set1);
System.out.println(set2);
System.out.println(set1.equals(set2));
}
Run Code Online (Sandbox Code Playgroud)
它产生:
[Bob, Tom, Sam]
[Sam, Bob, Tom]
false
Run Code Online (Sandbox Code Playgroud)
我的问题是澄清.有人可以帮助理解这个吗?为什么一个LinkedHashSet被认为是平等的,而同样的LinkedList呢?我假设定义List …
我需要检查两个地图的完全相等性,包括它们的顺序
@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));
}
Run Code Online (Sandbox Code Playgroud)
所有测试均通过,控制台输出:
===expected
thebiggest
longer
first
===actual
longer
first
thebiggest
Run Code Online (Sandbox Code Playgroud)
文档中到处都写到 LinkedHashMap 保持插入顺序。那么为什么两个相同但不同的有序映射的断言给出 true 呢?如果平等顺序很重要,我应该采取什么地图?