Hay*_*mey 80 java reference weak-references phantom-reference soft-references
有人可以解释三个参考类之间的区别(或发布链接到一个很好的解释)?SoftReference> WeakReference> PhantomReference,但当我会用每一个?为什么会出现WeakHashMap,但没有SoftHashMap或PhantomHashMap?
如果我使用以下代码......
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?!
}
Run Code Online (Sandbox Code Playgroud)
...怎么了?我是否必须ref在每个语句之前检查是否为null(这是错误的,但我应该怎么做)?对不起快速问题,但我无法理解这些Reference课程......谢谢!
seh*_*seh 59
该软件包的Java库文档java.lang.ref描述了三种显式引用类型的强度递减.
如果SoftReference希望引用的对象保持活动状态,直到主机进程内存不足,则使用a .在收集器需要释放内存之前,该对象将无法进行收集.松散地说,绑定一个SoftReference手段,"钉住对象,直到你不能再."
相比之下,WeakReference当你不想影响引用对象的生命周期时,使用a ; 你只是想制作一个单独的断言关于引用的对象,只要它仍然活着.对象的收集资格不受绑定WeakReferences的影响.类似于从对象实例到相关属性的外部映射,只要相关对象处于活动状态,只需要记录属性,这对于WeakReferences和WeakHashMap.
最后一个PhantomReference- 很难刻画.就像WeakReference,这样的绑定PhantomReference对引用对象的生命周期没有影响.但与其他参考类型不同,人们甚至无法取消引用a PhantomReference.从某种意义上说,就呼叫者而言,它并不指向它指向的东西.它只允许一个人将一些相关数据与引用的对象相关联 - 这些数据可以在以后PhantomReference相关的队列中进行检查和处理ReferenceQueue.通常,从PhantomReference该派生类型派生类型并包括一些附加数据.不幸的是,有一些倾向于使用这种派生类型.
在您的示例代码中,它不是ref引用(或者,如果您愿意,"变量"),它可以为null.相反,它是通过调用获得的值Reference#get()可能为null.如果发现它是空的,那你就太晚了; 引用的对象已经被收集了:
final String val = ref.get();
if (null != val)
{
// "val" is now pinned strongly.
}
else
{
// "val" is already ready to be collected.
}
Run Code Online (Sandbox Code Playgroud)
链接:https://community.oracle.com/blogs/enicholas/2006/05/04/understanding-weak-references
PhantomHashMap因为幻像引用get总是返回null,所以效果不好.
缓存很难,所以SoftHashMap可能效果不如您想象的那么好.但是,我相信Google的集合库包含一般参考地图实现.
你应该总是检查get返回非null.(注意,没有检查Reference引用本身不是 - null.)在实习字符串的情况下,它总是会,但(一如既往)不要试图"聪明"它.