树集是否可能等于哈希集,但哈希集等于树集

2022-08-31 15:12:00

我今天接受了一次采访,接受采访的人对我的陈述感到困惑,他问是否有可能等于但不等于。我说“不”,但根据他的说法,答案是“是”。TreeSetHashSetHashSetTreeSet

这怎么可能?


答案 1

你的面试官是对的,他们在某些特定情况下并不具有等价关系。有可能等于,反之亦然。下面是一个示例:TreeSetHashSet

TreeSet<String> treeSet = new TreeSet<>(String.CASE_INSENSITIVE_ORDER);
HashSet<String> hashSet = new HashSet<>();
treeSet.addAll(List.of("A", "b"));
hashSet.addAll(List.of("A", "B"));
System.out.println(hashSet.equals(treeSet)); // false
System.out.println(treeSet.equals(hashSet)); // true

这样做的原因是,使用比较器来确定元素在使用 时是否重复。TreeSetHashSetequals

引用:TreeSet

请注意,如果要正确实现 Set 接口,则由集合维护的排序(无论是否提供显式比较器)必须与 equals 一致


答案 2

如果不违反等于或 Set 的契约,就不可能做到这一点。Java中相等的定义需要对称性,即 必须与 相同。a.equals(b)b.equals(a)

事实上,Set的文档说

如果指定的对象也是一个集合,两个集合具有相同的大小,并且指定集合的每个成员都包含在此集合中(或者等效地,此集合的每个成员都包含在指定的集中),则返回 true。此定义可确保 equals 方法在 set 接口的不同实现中正常工作。