3

在对如何在 android 中传递对象引用进行一些研究时,我正在考虑以下问题。

假设我有一个带有 Long 作为键的 WeakHashmap。现在我将一个对象放入这个 WeakHashMap 并将其分配给键“new Long(1)”(假设我将保存对这个 Long 的引用)。

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

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

1 回答 1

11

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

现在,你的例子。这有点棘手。从javadoc for 中Long,该valueOf方法通过“缓存频繁请求的值”来提高性能。这意味着无论您使用valueOf还是,答案都会有所不同new

在您的情况下,您使用的new每个new Long(1)都是不同的对象 - 即不同的参考。但这是需要牢记的 -Integer其他Long包装器类型通常由 JVM 缓存,可能不会像您在WeakHashMap. Strings被实习,所以他们也有问题。

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

  1. 如果没有更多对您的原始引用,Long那么映射将在下一次机会时被 GC'ed。
  2. 我想你在这里很困惑。AHashMap用于hashcode比较equals。ATreeMap使用compareTo. 在任何情况下都没有区别,这是关于引用而不是任何平等概念。如果没有更多对您的对象的强引用,则映射将被 GC'ed。
  3. 不,它不会。正如我在 2. 中所说 -Map检查hashcode密钥equals是否已经在Map. 这Weak部分是在谈论参考。两个对象可以是equals但不是==

您可以使用 aPhantomReference跟踪您的密钥何时被 GC'ed。这可能会帮助您了解弱引用的工作原理。

于 2013-04-22T19:38:09.410 回答