【问题标题】:WeakHashMap with types like Long, Int or String具有 Long、Int 或 String 等类型的 WeakHashMap
【发布时间】:2013-04-22 19:24:02
【问题描述】:

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

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

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

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

【问题讨论】:

  • WeakHashMap 与您无法控制的类型一起使用非常危险。
  • 如果您知道自己在做什么,通常有风险的事情会变得非常方便。这就是我问的原因;-)

标签: java weak-references weakhashmap


【解决方案1】:

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

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

在您的情况下,您使用new,因此每个new Long(1) 将是一个不同的对象 - 即不同的引用。但这是需要牢记的——IntegerLong 和其他包装器类型通常由 JVM 缓存,在WeakHashMap 中可能不会像您期望的那样运行。 Strings 是实习生,所以他们也有问题。

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

  1. 如果没有更多对您原始 Long 的强引用,则映射将在下一次机会时被 GC'ed。
  2. 我认为您在这里感到困惑。 HashMap 使用 hashcodeequals 进行比较。 TreeMap 使用 compareTo。在任何情况下都没有区别,这是关于引用而不是任何平等概念。如果没有更多对您的对象的强引用,则映射将被 GC 处理。
  3. 不,不会。正如我在 2 中所说的 - Map 在检查密钥是否已经在 Map 中时使用 hashcodeequalsWeak 部分是在谈论引用。两个对象可以是equals,但不能是==

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

【讨论】:

    猜你喜欢
    • 2014-05-09
    • 1970-01-01
    • 1970-01-01
    • 2013-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-08
    • 1970-01-01
    相关资源
    最近更新 更多