java - 为什么 ConcurrentSkipListSet.contains 需要比较器而不是等于

标签 java concurrency set

我正在使用 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 需要 ComparatorComparable。 (2) Javadoc 说它将使用 equals 方法。

  1. ConcurrentSkipListSet 是一个可导航的有序集合,因此所有元素要么必须保持自然顺序,要么您必须指定一个比较器。
  2. 我认为 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/

相关文章:

java - 使用微调器在 Activity 之间传输数据

java - war 的 lib 和 Ear 的 lib 之间的 Wildfly 类加载器问题

c - 我怎样才能产生 n 个子进程并发运行,测量它们的执行时间并防止它们中的每一个都超过最大执行时间?

javascript - JavaScript 中有 Set 字面量吗?

java - 我可以从 JPA bean 获取对管理它的 EntityManager 实例的引用吗?

c# - 如何向网络服务发送特殊字符?

c# - 内存模型和线程池

c++ - 使用 volatile long 作为原子

java - 如何将二维数组转换为Set?

c++ - C++中set_intersection可以和hash_set一起使用吗?