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

Chr*_*ian 2 java collections set equivalence guava

番石榴的JavaDocSets.SetView.union()(以及intersection(),difference()symmetricDifference())提及"对等关系":

结果是不确定的,如果set1set2是基于不同的等价关系集(如HashSet,TreeSetMap.keySet()一个的IdentityHashMap都是).

我很难理解那句话的意思.

术语表将"等价关系"定义反身(" a.relation(a)总是true"),对称(a1.relation(a2) == a2.relation(a1))和传递(a1.relation(a2) && a2.relation(a3)暗示a1.relation(a3)) - 并且指Object.equals()'docs'.(不幸的是,番石榴维基没有详细说明......

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

Rad*_*def 6

听起来他们指的是什么时候Set不使用equalshashCode比较元素由于某种原因.最常见的例子是TreeSet自定义Comparator.例如,我们可以这样:

Set<String> a = new TreeSet<>();
Set<String> b = new TreeSet<>(String.CASE_INSENSITIVE_ORDER);
Run Code Online (Sandbox Code Playgroud)

的集,交集的等ab是未定义的,因为ab具有元件之间定义的不同的等价关系.

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

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