在 java 中设置对象引用集

2022-09-03 04:54:56

我需要创建一组对象。问题是我不想将哈希或相等性建立在对象的哈希码和等于实现的基础上。相反,我希望哈希代码和相等性仅基于每个对象的引用标识(即:引用指针的值)。

我不知道如何在Java中做到这一点。

这背后的原因是我的对象不能可靠地实现equals或hashCode,在这种情况下,引用标识就足够了。


答案 1

我猜java.util.IdentityHashMap就是你要找的(注意,没有)。查找 API 文档:IdentityHashSet

此类使用哈希表实现接口,在比较键(和值)时使用引用相等性代替对象相等性。换言之,在 一个 中,两个键被视为相等,当且仅当 。(在正常实现(如)中,两个键被视为相等,当且仅当 .)MapIdentityHashMapk1k2(k1==k2)MapHashMapk1k2(k1==null ? k2==null : k1.equals(k2))

此类不是通用实现!虽然这个类实现了接口,但它故意违反了 的一般契约,该协定要求在比较对象时使用该方法。此类设计仅用于需要引用相等语义的极少数情况。MapMapMapequals

编辑:请参阅下面Joachim Sauer的评论,根据某个.您需要执行如下操作:SetMap

Set<E> mySet = Collections.newSetFromMap(new IdentityHashMap<E, Boolean>());

答案 2

您可以将对象包装到一个包装器类中,然后可以简单地实现并基于对象的标识。hashcodeequals