Sets.SetView.union()
(以及intersection()
,difference()
和symmetricDifference()
)的番石榴JavaDocs提及“等价关系”:
如果
set1
和set2
是基于不同等价关系(HashSet
,TreeSet
和Map.keySet()
IdentityHashMap
的集合,则结果未定义1}}都是)。
我很难理解那句话的含义。
词汇表defines "equivalence relation"为reflexive(“a.relation(a)
始终为true
”),symmetric(a1.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>
),是吗?
答案 0 :(得分:6)
听起来他们指的是Set
由于某种原因没有使用equals
和hashCode
来比较元素。最常见的示例是TreeSet
,其中包含自定义Comparator
。例如,我们可以这样:
Set<String> a = new TreeSet<>();
Set<String> b = new TreeSet<>(String.CASE_INSENSITIVE_ORDER);
a
和b
的并集,交集等未定义,因为a
和b
在元素之间定义了不同的等价关系。
当Java SE谈论与equals
不一致的排序时,也提到了这种情况(参见TreeSet
):
请注意,如果要正确实现
Set
接口,则由集合维护的排序(无论是否提供显式比较器)必须与equals 一致。 (有关与equals 一致的精确定义,请参阅 Comparable
或Comparator
。)这是因为Set
接口是根据{{1操作,但是equals
实例使用其TreeSet
(或compareTo
)方法执行所有元素比较,因此从这个方法看,两个被认为相等的元素是设定,平等。集合的行为定义良好,即使它的排序与equals不一致;它只是不遵守compare
接口的一般合同。