java中的对象引用集

发布于 2024-08-30 23:02:24 字数 183 浏览 4 评论 0原文

我需要创建一组对象。担心的是我不想将散列或相等基于对象的 hashCode 和 equals 实现。相反,我希望哈希码和相等性仅基于每个对象的引用标识(即:引用指针的值)。

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

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

I need to create a Set of objects. The concern is I do not want to base the hashing or the equality on the objects' hashCode and equals implementation. Instead, I want the hash code and equality to be based only on each object's reference identity (i.e.: the value of the reference pointer).

I'm not sure how to do this in Java.

The reasoning behind this is my objects do not reliably implement equals or hashCode, and in this case reference identity is good enough.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

红颜悴 2024-09-06 23:02:24

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

此类使用哈希表实现 Map 接口,在比较键(和值)时使用引用相等代替对象相等。换句话说,在 IdentityHashMap 中,两个键 k1k2 被视为相等当且仅当 (k1==k2)。 (在正常的Map实现中(如HashMap),两个键k1k2被认为是相等的当且仅当<代码>(k1==null ? k2==null : k1.equals(k2)).)

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

编辑:请参阅下面 Joachim Sauer 的评论,基于特定地图制作集合非常容易。你需要做这样的事情:

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

I guess that java.util.IdentityHashMap is what you're looking for (note, there's no IdentityHashSet). Lookup the API documentation:

This class implements the Map interface with a hash table, using reference-equality in place of object-equality when comparing keys (and values). In other words, in an IdentityHashMap, two keys k1 and k2 are considered equal if and only if (k1==k2). (In normal Map implementations (like HashMap) two keys k1 and k2 are considered equal if and only if (k1==null ? k2==null : k1.equals(k2)).)

This class is not a general-purpose Map implementation! While this class implements the Map interface, it intentionally violates Map's general contract, which mandates the use of the equals method when comparing objects. This class is designed for use only in the rare cases wherein reference-equality semantics are required.

edit: See Joachim Sauer's comment below, it's really easy to make a Set based on a certain Map. You'd need to do something like this:

Set<E> mySet = Collections.newSetFromMap(new IdentityHashMap<E, Boolean>());
何以笙箫默 2024-09-06 23:02:24

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

You could wrap your objects into a wrapper class which could then implement hashcode and equals based simply on the object's identity.

软糯酥胸 2024-09-06 23:02:24

您可以扩展 HashSet (或实际上 - AbstractSet),并使用 IdentityHashMap 使用 System.identityHashCode(object) 而不是 obj.hashCode()

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

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

You can extend HashSet (or actually - AbstractSet) , and back it with IdentityHashMap which uses System.identityHashCode(object) instead of obj.hashCode().

You can simply google for IdentityHashSet, there are some implementations already. Or use Collections.newSetFromMap(..) as suggested by Joachim Sauer.

This of course should be done only if you are not in "possession" of your objects' classes. Otherwise just fix their hashCode()

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文