4

目前,我创建了一个 HashMap,其中 Object Id 作为键,1 作为值。该方法会询问 Object/Id 并检查是否有匹配的键。

那样行吗?或者,是否有更好的选择?

4

7 回答 7

10

这取决于您所说的“是”是什么意思。

如果您的意思是对象身份(即),那么您可以按照您描述的方式object1 == object2使用IdentityHashMap 。

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

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

Phill Sacre通过建议让我想起了一些事情List.contains()。您不必使用Set 或 Map 实现。您可以使用列表(例如ArrayList)。您可能会发现让包含在列表中执行线性搜索的成本低于维护散列结构的成本。

于 2009-01-20T09:47:14.083 回答
7

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

但是请记住,无论您做什么,都应该始终实现 equals() 和 hashCode()

于 2009-01-20T09:41:57.137 回答
5

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

于 2009-01-20T09:47:45.673 回答
3

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

编辑:

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

  1. 引用
  2. 风俗

默认Object比较是通过引用完成的,并在Object类上实现。

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

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

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

还有正确数据结构的问题。您可以使用 aList而不是Hash结构。您应该使用的数据结构类型取决于您。这取决于许多想法,例如您打算将多少对象放入集合中,将有多少访问,插入等。

于 2009-01-20T09:41:54.360 回答
2

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

于 2009-01-20T09:42:30.440 回答
1

正如布鲁诺建议的那样,您可以为固定的对象列表使用一组,然后调用contains().

如果您使用 a HashSet,请确保您覆盖hashCode()了在这种情况下用于身份检查的对象的实现。

(上次我研究 JRE 时,您使用 a 的方法HashMap正是 aHashSet所做的!)

于 2009-01-20T09:43:57.380 回答
1

“来自另一个列表”的定义是什么?是对象平等吗?那么你所拥有的是好的,但你可能会考虑使用 (Hash)Set 以获得更好的清晰度。

如果它是你需要的引用相等然后查找IdentityHashMap,或者使用 a HashSetofIdentityHashcode

于 2009-01-20T09:44:36.957 回答