gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:20:15 26 4
gpt4 key购买 nike

我正在使用 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com