Guava JavaDocs基于不同的“等价关系”集合意味着什么?

时间:2018-03-27 22:03:24

标签: java collections set guava equivalence

Sets.SetView.union()(以及intersection()difference()symmetricDifference())的番石榴JavaDocs提及“等价关系”:

  

如果set1set2是基于不同等价关系(HashSetTreeSetMap.keySet() IdentityHashMap的集合,则结果未定义1}}都是)。

我很难理解那句话的含义。

词汇表defines "equivalence relation"reflexive(“a.relation(a)始终为true”),symmetrica1.relation(a2) == a2.relation(a1))和{{3} (a1.relation(a2) && a2.relation(a3)隐含a1.relation(a3)) - 并引用transitive。 (不幸的是,Object.equals()' docs没有详细说明......

但是Set的不同类型在这方面有何不同(即等价关系)?他们似乎都继承了Guava wiki?它与集合所持有的对象类型无关(例如Set<Cow>Set<Chicken>),是吗?

1 个答案:

答案 0 :(得分:6)

听起来他们指的是Set由于某种原因没有使用equalshashCode来比较元素。最常见的示例是TreeSet,其中包含自定义Comparator。例如,我们可以这样:

Set<String> a = new TreeSet<>();
Set<String> b = new TreeSet<>(String.CASE_INSENSITIVE_ORDER);

ab的并集,交集等未定义,因为ab在元素之间定义了不同的等价关系。

当Java SE谈论与equals不一致的排序时,也提到了这种情况(参见TreeSet):

  

请注意,如果要正确实现Set接口,则由集合维护的排序(无论是否提供显式比较器)必须与equals 一致。 (有关与equals 一致的精确定义,请参阅ComparableComparator。)这是因为Set接口是根据{{1操作,但是equals实例使用其TreeSet(或compareTo)方法执行所有元素比较,因此从这个方法看,两个被认为相等的元素是设定,平等。集合的行为定义良好,即使它的排序与equals不一致;它只是不遵守compare接口的一般合同。

相关问题