gpt4 book ai didi

java - 我可以使用 identityHashCode 在尊重相同性的对象之间生成 compareTo 吗?

转载 作者:行者123 更新时间:2023-12-03 10:03:50 27 4
gpt4 key购买 nike

我想在两个对象之间实现一个简单的比较器,它的唯一要求是

  • 它是一个有效的比较器(即定义所有对象的线性顺序)和
  • .compare当且仅当对象相同时才返回 0。

  • 威尔 Comparator.comparing(System::identityHashCode)工作?还有其他方法吗?
    动机:
    我想构建一个集合,允许我将时间戳消息存储在线程安全集合中,该集合将支持诸如“获取时间戳位于 [a,b) 中的所有消息”之类的查询。
    看来 Guava 的 TreeMultimap使用全局锁(编辑:如果用 synchronizedSortedSetMultimap 包装器包装)和 ConcurrentSkipListMap似乎每次只支持一个条目(它是一张 map ,而不是多张 map )。所以我想只使用一组对: ConcurrentSkipListSet<ImmutablePair<Float,Message>> db ,
    其中对按词法排序,首先按时间(使用 Float.compareTo )然后按类似 Comparator.nullsFirst(Comparator.comparing(System::identityHashCode)) .
  • nullsFirst就这样吗db.subSet(ImmutablePair.of(a,null), ImmutablePair.of(b,null))查询半开时间间隔[a,b)。
  • 你明白为什么我关心比较器保持相同性:如果消息比较器对不相同的消息返回零,消息可能会被删除。
  • 你也明白了为什么我不需要比较器的其他东西:它就在那里,所以我可以使用 ConcurrentSkipListSet 的存储机制。 .我当然不想强加于用户(好吧,只是我 :-) 来实现 Message 的比较器.
  • 另一种可能的解决方案是使用 ConcurrentSkipListMap<Float, Set<Message>> (使用线程安全的 Set<> 实例)但在内存方面似乎有点浪费,一旦消息被删除,我需要自己删除 emptySet 以节省内存。

  • 编辑:正如一些人所指出的,identityHashCode 可能会产生冲突,实际上我现在已经确认在我的设置中存在这种冲突(这大致相当于上面有 4K 个集合,每个集合在每个时间段填充 4K 消息)。这很可能是我看到一些消息丢失的原因。所以我现在比以往任何时候都更有兴趣找到某种方法来拥有一个真正尊重相同性的“不可知”比较运算符。实际上,64 位哈希值(而不是 identityHashCode 提供的 32 位值)可能就足够了。

    最佳答案

    虽然不能保证,但我怀疑这导致问题的可能性微乎其微。System.identityHashCode返回 Object.hashCode 的值如果没有被覆盖,将返回,包括这个 in the documentation :

    As much as is reasonably practical, the hashCode method defined by class Object does return distinct integers for distinct objects.


    那么“在合理可行的范围内”就足够了吗?虽然不能保证,但如果您遇到导致问题的情况,我会感到非常惊讶。您必须有两个具有完全相同时间戳的消息以及 JVM 的 Object.hashCode 的位置。实现为两条消息返回相同的值。
    如果那个巧合的结果是“核电站爆炸”,那么我不会冒险。如果这种巧合的结果是“我们未能向客户收费” - 甚至“我们向客户收费两次,并且可能会被起诉”,如果没有更好的替代方案,我可能会接受这个机会。

    关于java - 我可以使用 identityHashCode 在尊重相同性的对象之间生成 compareTo 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65389561/

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