Java 什么是软接触的物体?
我试图通过这篇“Java中的软引用”文章来研究软引用的含义: 我理解这篇文章的问题是,它通过术语“软可达对象”定义了术语“软引用”,但我不知道“软可达对象”是什么意思 也就是说,堆中的对象要么有对它的引用,要么没有,对吗 引用要么指向有效对象,要么为null,对吗 什么时候一个对象变得“柔和地”可到达Java 什么是软接触的物体?,java,garbage-collection,soft-references,Java,Garbage Collection,Soft References,我试图通过这篇“Java中的软引用”文章来研究软引用的含义: 我理解这篇文章的问题是,它通过术语“软可达对象”定义了术语“软引用”,但我不知道“软可达对象”是什么意思 也就是说,堆中的对象要么有对它的引用,要么没有,对吗 引用要么指向有效对象,要么为null,对吗 什么时候一个对象变得“柔和地”可到达 还是我完全弄错了?强引用、软引用和弱引用 Student strongReference = new Student(); WeakReference<Student> weak
还是我完全弄错了?强引用、软引用和弱引用
Student strongReference = new Student();
WeakReference<Student> weakReference = new WeakReference<>(strongReference);
因此,避免将从get()
方法返回的非null对象作为静态变量或实例变量的弱引用或软引用,否则它只会破坏这些变量的使用。如果需要以弱引用或软引用的形式存储静态或实例变量,那么最好使用其中任何一种方法。当您需要使用get()
时,请检查NOTNULL并仅用作本地变量。如果可能,只传递给其他方法弱引用或软引用
WeakReference和SoftReference之间的区别在不同的链接中得到了很好的解释,其中一个链接是:
p.S.WeakReference和SoftReference对象类型的引用是强引用的,如果没有强引用可用,则是弱或软可访问的包装对象(可以使用get()
检索对象)。
WeakReference weakRefOfStudent=newweakreference(newstudent())代码>
weakRefOfStudent
是类型为WeakReference.java
的强引用,并且可以每周访问Student类型堆中的对象。可通过weakrefstudent.get()
访问该对象。如果它已被垃圾收集或未被垃圾收集,则它可能为空,也可能不为空
这只是为了澄清可能出现的疑问 我认为这篇链接文章在第一句话中很好地解释了这一点。软引用和软可及对象在这里是同义的
因此,对你的问题的正确答案是,“软可及对象是仅由软引用引用的对象”
关于软引用的性质,这篇文章比我在这里的一些段落中解释得更好。“软可及对象没有指向它的强引用”。@luk2302是的,我注意到文章中的这句话,但它是什么意思?我想我理解强引用(普通引用)的含义,但之前由强引用指向的对象是否可以“软可达”@dbl您提供的链接中的可达性部分对此进行了解释。非常感谢。如果你把这个作为一个答案,我会接受的。没有必要,祝你学习顺利。这是一个很好的话题,也许有些人会添加一个更广泛的答案,你应该接受……这根本没有回答OPs问题,也没有解释这些参考的性质以及如何(正确地)回答使用它们-而不仅仅是创建它们。@nits.kk感谢您提供了强引用、弱引用和软引用的清晰示例。对象是否只有通过新的SoftReference(…)
才能“软访问”?@非常客观我已经编辑了我的答案。希望它能帮助我们接受。我只想添加以下两个链接,进一步澄清我的误解:1。2.是的,这里有很多对你有帮助的链接。我第一次遇到这些术语是在我开始使用Android时。有太多与记忆有关的问题,我开始寻找这些术语。如果我的回答对您有帮助,您可以将其标记为已接受。您必须区分软引用(软引用的一个实例软引用
)及其引用对象(可通过封装引用访问的对象)。后者是软可及的对象。然而,并非每个软可及对象都是软引用的引用对象。它们可以从另一个软可及对象间接可及。
Student strongRef = new Student();
SoftReference<Student> softReference = new SoftReference<>(strongRef);
Student stRef = new Student();
SoftReference <Student> sfRef = new SoftReference<>(stRef);
stRef = null;
SoftReference <Student> sfRef = new SoftReference<>(new Student());
Student strongReference = new Student();
SoftReference<Student> softReference = new SoftReference<>(strongReference);
strongReference = null; // object in heap is softly reachable now
Student anotherStrongReference = softReference.get();
if(anotherStrongReference != null){
// you have a strong reference again
}