有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java WeakHashMap,具有Long、Int或String等类型

在研究如何在安卓中传递对象引用时,我想到了以下几点

让我们假设我有一张和钥匙一样长的WeakHashmap。现在我将一个对象放入这个WeakHashMap,并将其分配给键“new Long(1)”(假设我将保存对这个Long的引用)

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

  1. WeakHashMap中的对象会发生什么
  2. 如果我用自己的类替换Long,并使用Long成员,如果它与另一个类型相同的对象(我自己的类)进行比较,并且该对象中的值相同,那么让它的compare()-方法返回true会怎么样
  3. 假设在这两种情况下,WeakReference都被清除。如果我在清除第一个on out之前使用第二个创建的密钥访问WeakHasMap一次,会有什么不同吗

共 (1) 个答案

  1. # 1 楼答案

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

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

    在你的例子中,你使用了new,所以每个new Long(1)都是不同的对象,即不同的引用。但这是需要记住的-IntegerLong和其他包装类型通常由JVM缓存,它们的行为可能与WeakHashMap中的预期不同String被拘留的人也有问题

    总之,要回答你的问题:

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

    可以使用^{}track when your key is GC'ed。这可能会帮助你理解弱引用是如何工作的