我正在使用ConcurrentSkipListSet并使用contains方法。
根据JAVA文档所述,contains方法返回true,如果此集合包含指定的元素。更正式地说,当且仅当此集合包含一个元素e使得o.equals(e)时,返回true。
但是经过我的测试,似乎没有使用equals方法,而是强制使用Comparator。请帮助我理解JAVA规范和实现之间的这种不一致。
ConcurrentSkipListSet
/** * 如果使用比较器,则返回ComparableUsingComparator,否则将关键字强制转换为可比较类型,可能会导致ClassCastException, * 而这个异常会传播回调用者。 */ private Comparable comparable(Object key)
在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
TreeSet
的文档可能适用:“请注意,集合维护的顺序(无论是否提供了显式比较器)必须与等于关系一致,如果要正确实现 Set 接口,则必须如此。(有关与等于关系一致的精确定义,请参见 Comparable 或 Comparator。)” - Louis WassermanTreeSet.contains
的文档中也有同样具有误导性的句子,显然这是在Java 6中故意添加的。 - Holger