目前,我创建一个HashMap,其中Object ID为key,值为1。该方法要求对象/ ID并检查是否有匹配的键。检查一个对象是否来自另一个对象(比如固定的)对象列表的最好方法是什么?
那好吗?或者,是否有更好的替代方案?
目前,我创建一个HashMap,其中Object ID为key,值为1。该方法要求对象/ ID并检查是否有匹配的键。检查一个对象是否来自另一个对象(比如固定的)对象列表的最好方法是什么?
那好吗?或者,是否有更好的替代方案?
没关系。或者,您可以使用HashSet。
编辑:
您可以通过两种方式比较对象:
默认Object
比较通过引用完成,它的实施上类Object
。
如果有任何类在您的对象的层次结构中将覆盖此默认实现,那么您将执行自定义比较。如果发生这种情况,您还必须覆盖hashcode
。
鉴于此,IF要通过参照比较对象,但有平等的定制实现,那么你应该使用IdentityHashMapELSE 使用HashSet
。
如果你想维护当前的实施与HashMap
它也很好。 HashSet在内部使用HashMap实现。但是,不要将该值设置为1,而应将其设置为null
。
还有一个问题,正确的数据结构。您可以使用List
而不是哈希结构。您应该使用的数据结构的类型取决于您。这取决于很多人的想法,比如你打算在系列中放置多少物品,有多少个访问,插入等等。
List.contains(Object)会做你想做的吗?
请记住,不管你做什么,你应该总是implement equals() and hashCode()。
这基本上是HashSet所做的,但我会使用HashSet而不是重复执行。
由于布鲁诺建议您可以使用一组固定的对象列表,然后致电。
如果您使用的是HashSet
,请确保您覆盖了您的对象的hashCode()
实现,该实现在此情况下用于身份验证。
(上次我挖成JRE,您使用HashMap
正是一个HashSet
反正做的方法!)
什么是“是从另一个列表中”的定义?对象是否平等?那么你有什么好,但你可以考虑一个(哈希)集以更好的清晰度。
如果你需要再看看IdentityHashMap
,或使用IdentityHashcode
的
一个HashSet
这取决于你所说的“是”什么参考平等。
如果您是指对象标识(即object1 == object2
),那么您可以按照您所描述的方式使用IdentityHashMap。
如果您的意思是对象相等(即object1.equals(object2)
),那么您可以使用HashSet而不是使用HashMap进行窜改。
如果您的对象使用从Object继承的equals()
和hashCode()
的默认实现,那么这是一个区别,没有区别:默认实现对象相等性作为对象标识。
Phill Sacre通过暗示List.contains()
提醒了我一些事情。你不要有使用Set或Map实现。您可以使用列表(例如,ArrayList
)。您可能会发现,包含执行线性搜索的列表比维护散列结构的成本要低。
正如其他人所指出的,实际上,您可以使用HashSet或任何类型的Set。如果您使用自己的对象,请确保它们覆盖hashCode()
(HashSet必需)和equals()
(如果它们都覆盖,它们将与任何Set一起使用)。
请注意,HashSet实际上只是一个包含空值的HashMap的包装,所以唯一的区别就是意图更清晰。 – 2009-01-20 10:42:45