我需要创建一组对象。关注的是我不希望在对象的hashCode和equals实现上进行散列或相等。相反,我希望哈希码和相等只基于每个对象的引用标识(即:引用指针的值)。
我不确定如何用Java做到这一点。
这背后的原因是我的对象无法可靠地实现equals或hashCode,在这种情况下,引用标识就足够了。
答案 0 :(得分:24)
我想java.util.IdentityHashMap
就是你要找的东西(注意,没有IdentityHashSet
)。查找API文档:
此类使用哈希表实现
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>());
答案 1 :(得分:3)
您可以将对象包装到一个包装类中,然后可以根据对象的标识实现hashcode
和equals
。
答案 2 :(得分:1)
您可以延长HashSet
(或实际 - AbstractSet
),并使用IdentityHashMap
代替obj.hashCode()
进行支持。
你可以简单地谷歌搜索IdentityHashSet
,已经有一些实现了。或者按照Joachim Sauer的建议使用Collections.newSetFromMap(..)
。
当然,只有当你没有“拥有”对象的课程时,才应该这样做。否则,只需修复他们的hashCode()