2009-01-20 65 views

回答

3

没关系。或者,您可以使用HashSet

编辑:

您可以通过两种方式比较对象:

  1. 通过参考
  2. 定制

默认Object比较通过引用完成,它的实施上类Object

如果有任何在您的对象的层次结构中将覆盖此默认实现,那么您将执行自定义比较。如果发生这种情况,您还必须覆盖hashcode

鉴于此,IF要通过参照比较对象,但有平等的定制实现,那么你应该使用IdentityHashMapELSE 使用HashSet

如果你想维护当前的实施与HashMap它也很好。 HashSet在内部使用HashMap实现。但是,不要将该值设置为1,而应将其设置为null

还有一个问题,正确的数据结构。您可以使用List而不是哈希结构。您应该使用的数据结构的类型取决于您。这取决于很多人的想法,比如你打算在系列中放置多少物品,有多少个访问,插入等等。

2

这基本上是HashSet所做的,但我会使用HashSet而不是重复执行。

1

由于布鲁诺建议您可以使用一组固定的对象列表,然后致电。

如果您使用的是HashSet,请确保您覆盖了您的对象的hashCode()实现,该实现在此情况下用于身份验证。

(上次我挖成JRE,您使用HashMap正是一个HashSet反正做的方法!)

1

什么是“是从另一个列表中”的定义?对象是否平等?那么你有什么好,但你可以考虑一个(哈希)集以更好的清晰度。

如果你需要再看看IdentityHashMap,或使用IdentityHashcode

10

一个HashSet这取决于你所说的“是”什么参考平等。

如果您是指对象标识(即object1 == object2),那么您可以按照您所描述的方式使用IdentityHashMap

如果您的意思是对象相等(即object1.equals(object2)),那么您可以使用HashSet而不是使用HashMap进行窜改。

如果您的对象使用从Object继承的equals()hashCode()的默认实现,那么这是一个区别,没有区别:默认实现对象相等性作为对象标识。

Phill Sacre通过暗示List.contains()提醒了我一些事情。你不要使用Set或Map实现。您可以使用列表(例如,ArrayList)。您可能会发现,包含执行线性搜索的列表比维护散列结构的成本要低。

+0

请注意,HashSet实际上只是一个包含空值的HashMap的包装,所以唯一的区别就是意图更清晰。 – 2009-01-20 10:42:45

5

正如其他人所指出的,实际上,您可以使用HashSet或任何类型的Set。如果您使用自己的对象,请确保它们覆盖hashCode()(HashSet必需)和equals()(如果它们都覆盖,它们将与任何Set一起使用)。

相关问题