WeakHashMap,类型为Long,Int或String

时间:2013-04-22 19:24:03

标签: java weak-references weakhashmap

在做一些关于如何在android中传递对象引用的研究时,我正在考虑以下内容。

假设我有一个带有Long键的WeakHashmap。现在我将一个Object放入此WeakHashMap并将其分配给键'new Long(1)'(假设我将保存对此Long的引用)。

现在应用程序的另一部分创建了一个新的Long(1),然后我将我的第一个Long(用作键)设置为null。

  1. WeakHashMap中的Object会发生什么?
  2. 如果我将Long替换为具有Long成员的自己的Class并让其compare() - 如果将其与具有相同值的相同类型的另一个对象(我自己的类)进行比较,则返回true。
  3. 假设在两种情况下WeakReference都被清除。如果我在清除第一个之前使用第二个创建的密钥访问WeakHasMap会不会有所不同?

1 个答案:

答案 0 :(得分:10)

当没有对内存的强引用时,弱引用将被垃圾收集。

现在,你的例子。这有点棘手。从javadoc for Long开始,valueOf方法通过“缓存频繁请求的值”来提高性能。这意味着无论您使用valueOf还是new,它都会对答案产生影响。

在您的情况下,您使用new,因此每个new Long(1)将是一个不同的对象 - 即不同的引用。但是要记住这一点 - IntegerLong并且JVM通常缓存的其他包装类型可能不像WeakHashMap中那样表现。 String被实习,因此也存在问题。

无论如何,回答你的问题:

  1. 如果对原始Long没有更强的引用,那么映射将在下次机会时进行GC。
  2. 我觉得你在这里很困惑。 HashMap使用hashcodeequals进行比较。 TreeMap使用compareTo。无论如何它都没有区别,这是关于任何关于平等概念的引用。如果对您的对象没有更强的引用,则映射将为GC。
  3. 不,不会。正如我在2.中所说的那样 - Map在检查密钥是否已经在hashcode时使用equalsMapWeak部分正在讨论参考文献。两个对象可以是equals,但不能是==
  4. 您可以使用PhantomReferencetrack when your key is GC'ed。这可能有助于您了解弱引用的工作原理。