目前,我创建了一个HashMap,其中Object Id为键,值为1。并且该方法请求Object / Id并检查是否存在匹配的密钥。
可以吗?或者,是否有更好的替代方案?
答案 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。
修改强>
您可以通过两种方式比较对象:
默认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