gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-01 21:40:13 25 4
gpt4 key购买 nike

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

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

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

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

最佳答案

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

现在,你的例子。这有点棘手。来自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 在检查 Map 中是否已经存在键时使用 hashcodeequals >。 Weak 部分是关于引用的。两个对象可以等于但不能==

您可以使用 PhantomReferencetrack when your key is GC'ed .这可能有助于您了解弱引用的工作原理。

关于java - 具有 Long、Int 或 String 等类型的 WeakHashMap,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16155085/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com