我有两个种类的对象在我用其中的每一目的的一种具有一个相应目的的其他种类。

显而易见的选择,以跟踪的这种关系是一个 Map<type1, type2>, 像一个哈希.但不知怎的,我可疑的。我可以使用的一个目作为一个关键的在线图,通过它,它已经坐在另一个集合,也与检索其合作伙伴从地图上的任何时间?

后一个目的是创建的,我想绕过是一个标识符,对吗?所以可能没问题的。如果我serialize和deserialize钥匙?

任何其他解释?如果我用别的事情以相关对象对,喜欢一些我生成自己?

有帮助吗?

解决方案

  1. 关键需要正确实施.equals().hashCode()
  2. 密钥不得以任何方式更改
  3. 时将>更改为
  4. 理想情况下,在HashMap中用作键的任何对象都应该是不可变的。这将自动确保2.始终保持为真。
  5. 当用作关键字和/或值时,可能会保留其他GC对象。

其他提示

  

我有两种物品   应用程序中的每个对象   善良只有一个对应   另一种对象。

这听起来像是一种关系,因此可以使用简单的属性来实现。

它取决于执行情况的地图你可以选择:

  • 哈希 使用 等()哈希码().默认情况下(在目),这些都是基于对象的身份,这将工作确定,除非你serialize/deserialize.有一个适当的执行等()和哈希码()根据上述内容的对象你不会有任何问题,只要不修改就当它是一个关键在一散列的地图。

  • 树形图 使用 compareTo().没有默认的执行情况,因此需要提供一个。同样的限制也适用于执行哈希码()以及平等()所述。

您可以使用标准地图,但这样做会在地图中保留对对象的强引用。如果您的对象在另一个结构中被引用,并且您需要Map只是将它们链接在一起,请考虑使用WeakHashMap。

顺便说一句,你不必重写equals和hashCode,除非你必须考虑一个对象的几个实例是相等的......

  

我可以将一个对象用作Map中的一个键,传递它,将它放在另一个集合中,并随时从Map中检索它的伙伴吗?

是的,这里没问题。

  

创建一个对象后,我传来的只是一个标识符,对吧?所以可能没有问题。如果我对密钥进行序列化和反序列化怎么办?

没错,你只是传递一个引用 - 它们都指向同一个实际对象。如果序列化或反序列化对象,则会创建一个新对象。但是,如果您的对象正确实现了equals和hashCode,您仍然可以使用新的反序列化对象从地图中检索项目。

  

还有其他警告吗?我应该使用其他东西来关联对象,就像我自己生成的数字一样吗?

至于警告,是的,当对象在Map中时,你不能改变任何会导致对象的hashCode改变的东西。

任何对象都可以是地图键。这里重要的是确保为任何将用作映射键的对象覆盖.equals()和.hashCode()。

你这样做的原因是,如果你不这样做,则equals将被理解为对象相等,并且唯一的方法是你能够找到<!> quot; equal <!> quot; map键是拥有原始对象本身的句柄。

您覆盖哈希码,因为它需要与equals一致。这样,您定义为等于哈希的对象相同。

失败点是哈希码和等于函数。如果它们不能产生一致且正确的返回值,则Map的行为会很奇怪。 Effective Java 有完整的部分,非常强烈推荐。

您可以考虑使用Google Collection的 BIMAP

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top