我正在使用 ConcurrentSkipListSet 并使用 contains 方法。
根据包含方法的 JAVA 文档
如果此集合包含指定元素,则返回 true。更正式地说,当且仅当此集合包含满足 o.equals(e) 的元素 e 时才返回 true。
但是根据我的测试,似乎没有使用 equals 方法,而是必须使用 Comparator。请帮助我理解 JAVA 规范和实现之间的这种异常情况
并发跳过列表集
/** * 如果使用比较器,返回一个 ComparableUsingComparator,否则 * 将键转换为 Comparable,这可能会导致 ClassCastException, * 传播回调用者。 */ private Comparable comparable(对象键)
在 java.util.concurrent.ConcurrentSkipListMap.comparable(ConcurrentSkipListMap.java:663) 在 java.util.concurrent.ConcurrentSkipListMap.doGet(ConcurrentSkipListMap.java:821) 在 java.util.concurrent.ConcurrentSkipListMap.containsKey(ConcurrentSkipListMap.java:1608)
我正在使用 Oracle JDK 7
最佳答案
我认为有两个问题/疑虑,(1) 为什么 contains 需要 Comparator
或 Comparable
。 (2) Javadoc 说它将使用 equals
方法。
- ConcurrentSkipListSet 是一个可导航的有序集合,因此所有元素要么必须保持自然顺序,要么您必须指定一个比较器。
- 我认为 Javadoc 的表述不正确,或者至少是误导性的。在幕后,CSLS 将委托(delegate)给 ConcurrentSkipListMap.containsKey 因此它现在不控制 contains 实现。也就是说,我认为可以对 javadoc 进行澄清。
编辑:
还有一个 throws
文档说明这些对象不可比较
ClassCastException - if the specified element cannot be compared with the elements currently in this set
关于java - 为什么 ConcurrentSkipListSet.contains 需要比较器而不是等于,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37842219/