有没有办法通过其哈希码检索jvm对象

时间:2014-09-06 13:01:54

标签: java

假设我有一个对象,obj.hashCode()返回8973846,

我可以使用哈希码调用函数并获取对象吗?

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

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

但是有两个主要问题:

  1. 由于哈希码不能保证唯一,因此您将使用正确的哈希码检索某些内容,但不一定是您期望的内容。您需要对所有内容进行编码,以便哈希代码具有高概率的唯一性(当只有32位时,这将很难)。
  2. 你的垃圾收集器在这里会有一个很大的问题,除非你在完成它们时也从哈希映射中删除对象。通常,垃圾收集器会清除任何没有任何引用的实例,但在您的情况下,所有将在哈希映射中维护一个引用。欢迎来到亚利桑那州的Memory Leak City。
  3. 您可以尝试使用WeakHashMap来缓解第二个问题,但这可能会导致更多问题:当您稍后尝试检索某个对象时,它可能已经消失...