为什么不同类型的空集合相等?
2022-08-31 20:10:12
下面是什么机制使相等的不同类型?
import static org.testng.Assert.assertEquals;
@Test
public void whyThisIsEqual() {
assertEquals(new HashSet<>(), new ArrayList<>());
}
下面是什么机制使相等的不同类型?
import static org.testng.Assert.assertEquals;
@Test
public void whyThisIsEqual() {
assertEquals(new HashSet<>(), new ArrayList<>());
}
文档说:assertEquals(Collection<?> actual, Collection<?> expected)
断言两个集合以相同的顺序包含相同的元素。否则,将抛出断言错误。
因此,将比较集合的内容,如果两个集合都是空的,则这些内容是相等的。
他们不是...
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-9
Set::of