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

我使用ConcurrentSkipListSet并使用contains方法.

根据JAVA doc for contains方法

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

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

ConcurrentSkipListSet

/ **
     *如果使用比较器,则返回ComparableusingComparator,否则
     *将密钥转换为Comparable,这可能会导致ClassCastException,
     *传播回调用者.
     * /
    私人可比比较(对象键)

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)为什么包含需要Comparator或Comparable. (2)Javadoc说它将使用equals方法.

> ConcurrentSkipListSet是可导航的有序集合,因此所有元素必须保持自然顺序,或者必须指定比较器.
>我认为Javadoc声明不正确,或者至少它具有误导性.在引擎盖下,cslS将委托给concurrentskiplistmap.containsKey,因此它现在不控制contains实现.也就是说,我认为可以有一个论点来澄清javadoc.

编辑:
对于这些对象无法比较的事实,还有一个投掷文档

ClassCastException – if the specified element cannot be compared with
the elements currently in this set

相关文章

最近看了一下学习资料,感觉进制转换其实还是挺有意思的,尤...
/*HashSet 基本操作 * --set:元素是无序的,存入和取出顺序不...
/*list 基本操作 * * List a=new List(); * 增 * a.add(inde...
/* * 内部类 * */ 1 class OutClass{ 2 //定义外部类的成员变...
集合的操作Iterator、Collection、Set和HashSet关系Iterator...
接口中常量的修饰关键字:public,static,final(常量)函数...