为什么ConcurrentSkipListSet.contains需要比较器而不是equals

Amr*_*dey 6 java concurrency set

我使用ConcurrentSkipListSet并使用contains方法.

根据JAVA doc for contains方法

如果此set包含指定的元素,则返回true.更正式地说,当且仅当此集合包含o.equals(e)的元素e时才返回true.

但根据我的测试,似乎不使用equals方法,而是比较器是强制性的.请帮助我理解JAVA规范和实现之间的这种异常

ConcurrentSkipListSet

/***如果使用比较,返回ComparableUsingComparator,否则*投键具有可比性,这可能会导致ClassCastException异常, *其传播回调用者.*/private可比较(对象键)

在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

Joh*_*int 4

我认为有两个问题/担忧,(1)为什么 contains 需要 aComparatorComparable。(2) Javadoc 说它将使用该equals方法。

  1. ConcurrentSkipListSet 是一个可导航的有序集合,因此所有元素要么必须保持自然顺序,要么必须指定一个比较器。
  2. 我认为 Javadoc 的表述不正确,或者至少具有误导性。在底层,CSLS 将委托给 ConcurrentSkipListMap.containsKey,因此它现在不控制 contains 实现。也就是说,我认为可以有一个论点来澄清 javadoc。

编辑:还有一个throws文档说明这些对象不具有可比性

ClassCastException - 如果指定的元素无法与当前在此集合中的元素进行比较

  • 对这里的 Java 文档感到失望。没想到事情竟然这么不真实。我们倾向于认真对待它,几乎不通过实现进行调试来验证一切 (2认同)