2014-09-06 61 views
1

说来检索JVM对象我有一个对象,并obj.hashCode()返回8973846,有没有办法通过其哈希码

我可以调用一个函数的哈希码和获取对象回来?

+3

这将是更有趣知道为什么会有人想要这样做。 – 2014-09-06 13:08:20

回答

2

hashCode()不是唯一的(即不同的对象可以具有相同的hashCode,即使是相同类型的不同对象也可以具有相同的hashCode),所以不可能实现这样的方法。

1

当你创建你的对象时,你可以做的最好的事情就是把它们放到一个大的HashMap<Integer,Object>中,它将哈希代码映射到实例。这样,你可以稍后检索它们。

两个主要问题,虽然:

  1. 因为散列码不能保证是独一无二的,你会找回东西用正确的散列码,但不一定是事情,你正期待。您需要对所有代码进行编码,以便散列码具有很高的唯一性(当只有32位可用时,这很难实现)。
  2. 你的垃圾回收器在这里会遇到一个很大的问题,除非你在完成它们之后从哈希映射中删除对象。通常情况下,垃圾回收器会清除任何没有任何引用的实例,但在您的情况下,的所有内容都将在哈希映射中保留引用。欢迎来到亚利桑那州的记忆泄漏城市。

你可以尝试WeakHashMap缓解第二个问题,尽管这可能会导致更多的问题:当您尝试一个对象后进行检索,它可能已经消失了......

+0

如果hasCode()使用整数,为什么要输入'long'?不应该是'Map >',每个哈希码可能有多个对象,对吧? WeakHashMap怎么样,难道不能缓解gc问题? – 2014-09-06 13:17:29

+0

很多关于“长”与“int”的比较。我不知道是否值得存储集合......它取决于应用程序,以及是否值得检索*全部*匹配而不仅仅是*任何*匹配。尽管如此,我已经按照您的建议编辑了我的答案。 – 2014-09-06 13:21:04

相关问题