繁体   English   中英

在Java中设置的对象引用

[英]object reference set in java

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

我不确定如何在Java中执行此操作。

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

我想您正在寻找java.util.IdentityHashMap (请注意,没有IdentityHashSet )。 查找API文档:

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

此类不是通用的Map实现! 虽然此类实现Map接口,但它有意违反Map的常规协定,该协定要求在比较对象时使用equals方法。 此类仅设计用于仅在需要引用相等语义的情况下使用。

编辑 :请参阅下面的Joachim Sauer的评论,基于特定Map制作Set真的很容易。 您需要执行以下操作:

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

您可以将对象包装到包装器类中,然后可以实现hashcode并仅基于对象的标识进行equals

你可以扩展HashSet (或实际- AbstractSet ),并带回它IdentityHashMap它采用System.identityHashCode(object) ,而不是obj.hashCode()

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM