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

时间:2016-06-15 17:41:04

标签: java concurrency set

我正在使用ConcurrentSkipListSet并使用contains方法。

根据JAVA doc for contains方法

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

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

ConcurrentSkipListSet

/ **      *如果使用比较器,则返回ComparableUsingComparator, else      *将密钥转换为Comparable,这可能导致ClassCastException,      *传播回调用者。      * /     private Comparable comparison(对象键)

at java.util.concurrent.ConcurrentSkipListMap.comparable(ConcurrentSkipListMap.java:663)     at java.util.concurrent.ConcurrentSkipListMap.doGet(ConcurrentSkipListMap.java:821)     at java.util.concurrent.ConcurrentSkipListMap.containsKey(ConcurrentSkipListMap.java:1608)

我正在使用Oracle JDK 7

1 个答案:

答案 0 :(得分:3)

我认为有两个问题/疑虑,(1)为什么包含需要ComparatorComparable。 (2)Javadoc说它将使用equals方法。

  1. ConcurrentSkipListSet是一个可导航的有序集合,因此所有元素必须保持自然顺序,或者您必须指定比较器。
  2. 我认为Javadoc声明错误,或者至少它具有误导性。在引擎盖下,CSLS将委托给ConcurrentSkipListMap.containsKey,因此它现在不会控制contains实现。也就是说,我认为可以有一个论点来澄清javadoc。
  3. 编辑: 还有一个throws doc,因为这些对象不具有可比性

      

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