2011-09-05 58 views
6

Java定义一个Set接口,其中contains()定义如下:在Java中设置实例吗?

返回true如果这个集包含指定的元素。更多 正式返回true,当且仅当此集合包含一个元素e ,例如(o==null ? e==null : o.equals(e))

Collection接口contains()定义如下:

返回true如果该集合包含指定的元素。更多 正式返回true,当且仅当此集合包含 至少一个元素e,例如(o==null ? e==null : o.equals(e))

我需要一个Java“实例集”,其中基于==,而不是equals()。换句话说,一组硬性实例,其中A.equals(B)可以共存于同一组中的两个不同对象A和B,因为A!=B

在Java或某些公共库中提供了这样的“实例集”吗?我找不到任何东西,但可能会有人对SO更了解。如果没有,我会执行它。谢谢。

回答

13

JRE中没有直接的“实例集”。

但是有一个IdentityHashMap,它根据您的术语实现“实例映射”。

有一个叫Collections.newSetFromMap()方法,可以从任意Map实现创建Set

所以,你可以很容易地建立自己的实例设置是这样的:

Set<MyType> instanceSet = Collections.newSetFromMap(new IdentityHashMap<MyType,Boolean>()); 
+0

+1:比我快。 ;) –

+0

看起来这是我的实例集所需的基础。大。谢谢。 – JVerstry

+1

OP应该记住,以这种方式实现的'Set'违反了'Set'契约......就像'IdentityHashMap'违反了'Map'契约一样。无论如何,这可能是因为这样的类不是集合框架的标准部分。 –

1

你可以只实现equals方式类似:

public boolean equals(Obect o) { 
    return this == o; 
} 
+0

不错,我可以,但我想保持不同的实现equals()的机会。 – JVerstry

+1

好的:-)简单地说,我会说在尝试调用equals之前,几乎所有的集合都会检查引用的相等性。 – dacwe