使用类似于 Long、Int 或 String 的类型的 WeakHashMap

3

在研究如何在Android中传递对象引用时,我想到了以下内容。

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

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

  1. WeakHashMap中的对象会发生什么?
  2. 如果我用一个Long成员替换Long并让它的compare()方法返回true,如果与同一类型的另一个对象(我的自定义类)相比,它的Long中具有相同的值。
  3. 假设在两种情况下WeakReference被清除。如果我在清除第一个之前使用我的第二个创建的键访问WeakHasMap,是否会有所不同?

在你无法控制类型的情况下使用WeakHashMap是相当危险的。 - Louis Wasserman
通常情况下,如果你知道自己在做什么,那些看起来有风险的事情可能会变得非常方便。这就是为什么我在问的原因;-) - Chris
1个回答

12

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

现在来看你的例子。这有点棘手。根据Long的javadoc,valueOf方法通过"缓存经常请求的值"来提高性能。这意味着你使用valueOfnew会对答案产生影响。

在你的示例中,你使用new,因此每个new Long(1)都是不同的对象,即不同的引用。但这是需要注意的事情——IntegerLong和其他包装类型通常由JVM缓存,可能在WeakHashMap中表现与预期不同。String被interned,因此也存在问题。

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

如果没有任何对原始Long的强引用,那么映射将在下一个机会被垃圾回收。
我认为你在这里有些困惑。 HashMap使用hashcodeequals进行比较。而TreeMap使用compareTo。无论如何,这与引用有关,而不是任何等价概念。如果没有更多对您的对象的强引用,则映射将被垃圾回收。
不会。正如我在2中所说-当检查键是否已经存在于Map中时,Map使用hashcodeequalsWeak部分是关于引用的。两个对象可以equals但不是 ==
你可以使用PhantomReference跟踪你的键何时被垃圾回收。这可能有助于您理解弱引用的工作原理。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接