为什么不同类型的空集合相等?

2022-08-31 20:10:12

下面是什么机制使相等的不同类型?

import static org.testng.Assert.assertEquals;
@Test
public void whyThisIsEqual() {
    assertEquals(new HashSet<>(), new ArrayList<>());
}

答案 1

文档说:assertEquals(Collection<?> actual, Collection<?> expected)

断言两个集合以相同的顺序包含相同的元素。否则,将抛出断言错误。

因此,将比较集合的内容,如果两个集合都是空的,则这些内容是相等的。


答案 2

他们不是...

System.out.println(new HashSet<>().equals(new ArrayList<>())); // false

这特定于testng assertEquals

看看该方法的文档,它说:

断言两个集合以相同的顺序包含相同的元素。

这对我来说很荒谬,一个本身没有命令。Set

Set<String> set = new HashSet<>();
set.add("hello");
set.add("from");
set.add("jug");

System.out.println(set); // [from, hello, jug]

IntStream.range(0, 1000).mapToObj(x -> x + "").forEachOrdered(set::add);
IntStream.range(0, 1000).mapToObj(x -> x + "").forEachOrdered(set::remove);

System.out.println(set); // [jug, hello, from]

因此,在某个特定时间点将这些与 a 进行比较将产生有趣的结果。Collection

更糟糕的是,方法在内部实现随机化,因此顺序(或不是顺序)将不同于运行到运行。java-9Set::of