在 java 中设置对象引用集
2022-09-03 04:54:56
我需要创建一组对象。问题是我不想将哈希或相等性建立在对象的哈希码和等于实现的基础上。相反,我希望哈希代码和相等性仅基于每个对象的引用标识(即:引用指针的值)。
我不知道如何在Java中做到这一点。
这背后的原因是我的对象不能可靠地实现equals或hashCode,在这种情况下,引用标识就足够了。
我需要创建一组对象。问题是我不想将哈希或相等性建立在对象的哈希码和等于实现的基础上。相反,我希望哈希代码和相等性仅基于每个对象的引用标识(即:引用指针的值)。
我不知道如何在Java中做到这一点。
这背后的原因是我的对象不能可靠地实现equals或hashCode,在这种情况下,引用标识就足够了。
我猜java.util.IdentityHashMap
就是你要找的(注意,没有)。查找 API 文档:IdentityHashSet
此类使用哈希表实现接口,在比较键(和值)时使用引用相等性代替对象相等性。换言之,在 一个 中,两个键被视为相等,当且仅当 。(在正常实现(如)中,两个键被视为相等,当且仅当 .)
Map
IdentityHashMap
k1
k2
(k1==k2)
Map
HashMap
k1
k2
(k1==null ? k2==null : k1.equals(k2))
此类不是通用实现!虽然这个类实现了接口,但它故意违反了 的一般契约,该协定要求在比较对象时使用该方法。此类设计仅用于需要引用相等语义的极少数情况。
Map
Map
Map
equals
编辑:请参阅下面Joachim Sauer的评论,根据某个.您需要执行如下操作:Set
Map
Set<E> mySet = Collections.newSetFromMap(new IdentityHashMap<E, Boolean>());
您可以将对象包装到一个包装器类中,然后可以简单地实现并基于对象的标识。hashcode
equals