Chr*_*ian 2 java collections set equivalence guava
番石榴的JavaDoc的Sets.SetView.union()(以及intersection(),difference()和symmetricDifference())提及"对等关系":
结果是不确定的,如果
set1和set2是基于不同的等价关系集(如HashSet,TreeSet和Map.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>)无关,是吗?
听起来他们指的是什么时候Set不使用equals和hashCode比较元素由于某种原因.最常见的例子是TreeSet自定义Comparator.例如,我们可以这样:
Set<String> a = new TreeSet<>();
Set<String> b = new TreeSet<>(String.CASE_INSENSITIVE_ORDER);
Run Code Online (Sandbox Code Playgroud)
的集,交集的等a和b是未定义的,因为a和b具有元件之间定义的不同的等价关系.
Java SE在谈论与equals(与TreeSet)不一致的排序时也提到了这种情况:
请注意,如果要正确实现接口,则由集合维护的排序(无论是否提供显式比较器)必须与equals一致
Set.(参见Comparable或Comparator了解与equals一致的精确定义.)这是因为Set接口是根据equals操作定义的,但TreeSet实例使用其compareTo(或compare)方法执行所有元素比较,因此两个被认为相等的元素从集合的角度来看,方法是相等的.一套的行为是明确的,即使它的排序和equals不一致; 它只是不遵守Set界面的一般合同.
| 归档时间: |
|
| 查看次数: |
155 次 |
| 最近记录: |