gpt4 book ai didi

java - 了解 Java 的引用类 : SoftReference, WeakReference 和 PhantomReference

转载 作者:IT老高 更新时间:2023-10-28 11:45:00 34 4
gpt4 key购买 nike

有人可以解释三个引用类之间的区别(或发布一个很好的解释的链接)吗? SoftReference > WeakReference > PhantomReference,但我什么时候会使用每一个?为什么有 WeakHashMap 而没有 SoftHashMapPhantomHashMap

如果我使用以下代码...

WeakReference<String> ref = new WeakReference<String>("Hello!");
if (ref != null) { // ref can get collected at any time...
System.gc(); // Let's assume ref gets collected here.
System.out.println(ref.get()); // Now what?!
}

...会发生什么?我是否必须在每条语句之前检查 ref 是否为空(这是错误的,但我应该怎么做 )?很抱歉这些快速的问题,但我无法理解这些 Reference 类...谢谢!

最佳答案

Java 库 documentation for the java.lang.ref package表征了三种显式引用类型的递减强度。

当您希望被引用的对象在主机进程内存不足之前保持 Activity 状态时,您可以使用 SoftReference。在收集器需要释放内存之前,该对象将不符合收集条件。简单地说,绑定(bind)一个 SoftReference 的意思是,“固定对象,直到你不能再使用为止。”

相比之下,当您不想影响被引用对象的生命周期时,请使用 WeakReference;您只想对引用的对象进行单独的断言about,只要它仍然存在。对象的收集资格不受绑定(bind)的 WeakReference 存在的影响。像从对象实例到相关属性的外部映射,只要相关对象还活着,就需要记录属性,这对于 WeakReferences 和 WeakHashMap 来说是一个很好的用途>.

最后一个——PhantomReference——更难描述。与 WeakReference 一样,这种绑定(bind)的 PhantomReference 不会影响被引用对象的生命周期。但与其他引用类型不同的是,甚至不能取消引用 PhantomReference。从某种意义上说,就调用者所知,它并不指向它所指向的东西。它只允许将一些相关数据与引用对象相关联——当PhantomReference 在其相关ReferenceQueue 中排队时,这些数据可以在以后进行检查和操作。通常从 PhantomReference 派生一个类型,并在该派生类型中包含一些附加数据。不幸的是,使用这种派生类型需要进行一些向下转换。

在您的示例代码中,不是 ref 引用(或者,如果您愿意,“变量”)可以为空。而是调用 Reference#get() 得到的值。那可能是空的。如果发现为null,那就来不及了;被引用的对象已经在被收集的路上:

final String val = ref.get();
if (null != val)
{
// "val" is now pinned strongly.
}
else
{
// "val" is already ready to be collected.
}

关于java - 了解 Java 的引用类 : SoftReference, WeakReference 和 PhantomReference,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3329691/

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