java中的对象引用集

时间:2010-04-29 14:43:12

标签: java collections

我需要创建一组对象。关注的是我不希望在对象的hashCode和equals实现上进行散列或相等。相反,我希望哈希码和相等只基于每个对象的引用标识(即:引用指针的值)。

我不确定如何用Java做到这一点。

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

3 个答案:

答案 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)

您可以将对象包装到一个包装类中,然后可以根据对象的标识实现hashcodeequals

答案 2 :(得分:1)

您可以延长HashSet(或实际 - AbstractSet),并使用IdentityHashMap代替obj.hashCode()进行支持。

你可以简单地谷歌搜索IdentityHashSet,已经有一些实现了。或者按照Joachim Sauer的建议使用Collections.newSetFromMap(..)

当然,只有当你没有“拥有”对象的课程时,才应该这样做。否则,只需修复他们的hashCode()