java中的对象引用集

Lan*_*uhn 13 java collections

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

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

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

Jes*_*per 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>());
Run Code Online (Sandbox Code Playgroud)

  • 甚至还有在JDK的方法来创建一个`Set`与指定的后备`Map`,这就是所谓`newSetFromMap`:http://java.sun.com/javase/6/docs/api/java/util/Collections html的#newSetFromMap(java.util.Map%29 (11认同)
  • 不是,Set只是一个忽略值的Map.如果您不想在应用程序中始终处理它,您可以轻松编写一个包装器,使其看起来更像是一个"Set". (4认同)
  • +1 - 应该很容易实现基于Map实现的Set.这就是HashSet的实现方式...... (2认同)