检查对象是否来自另一个(比如固定的)对象列表的最佳方法是什么?

时间:2009-01-20 09:39:35

标签: java collections hashmap

目前,我创建了一个HashMap,其中Object Id为键,值为1。并且该方法请求Object / Id并检查是否存在匹配的密钥。

可以吗?或者,是否有更好的替代方案?

7 个答案:

答案 0 :(得分:10)

这取决于你所说的“是”。

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

如果你的意思是对象平等(即object1.equals(object2))那么你可以使用HashSet而不是使用HashMap进行编辑。

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

Phill Sacre通过建议List.contains()提醒我一些事情。您没有拥有来使用Set或Map实现。您可以使用列表(例如ArrayList)。您可能会发现包含通过 short 列表执行线性搜索比维护散列结构更便宜。

答案 1 :(得分:7)

List.contains(Object)会做你想做的事吗?

请记住,无论你做什么,你都应该implement equals() and hashCode()

答案 2 :(得分:5)

正如其他人所说,你可以使用HashSet,或者实际使用任何类型的Set。如果您使用自己的对象,请确保它们覆盖hashCode()(HashSet所需)和equals()(如果它们都覆盖两者,它们将适用于任何Set)。

答案 3 :(得分:3)

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

修改

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

  1. 参考
  2. 定制
  3. 默认Object比较是通过引用完成的,并且已在Object类上实现。

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

    鉴于此, IF 您想要通过引用比较对象,但是有一个自定义的相等实现,那么您应该使用IdentityHashMap ELSE 使用HashSet

    如果您想使用HashMap维护当前的实施,那也没关系。 HashSet在内部使用HashMap实现。但是,不是将值设置为1,而是将其设置为null

    还有正确的数据结构的问题。您可以使用List代替哈希结构。您应该使用的数据结构类型取决于您。这取决于许多想法,比如你打算在集合中放置多少个对象,将有多少次访问,插入等等。

答案 4 :(得分:2)

这基本上就是HashSet的作用,但我会使用HashSet而不是重复实现。

答案 5 :(得分:1)

正如Bruno建议你可以使用一个集合作为固定的对象列表,然后调用contains()

如果你使用HashSet,请确保覆盖对象的hashCode()实现,在这种情况下,我们会使用它来进行身份检查。

(上次我挖掘JRE时,您使用HashMap的方法正是HashSet所做的那样!)

答案 6 :(得分:1)

“来自其他名单”的定义是什么?是对象平等吗?那么你所拥有的是好的,但你可以考虑一个(哈希)集来更清晰。

如果您需要引用相等,那么请查找IdentityHashMap,或使用HashSet IdentityHashcode