弱引用的使用是我从未见过的实现,所以我试图弄清楚它们的用例是什么,以及实现是如何工作的。您何时需要使用WeakHashMap
或WeakReference
?它是如何使用的?
发布于 2008-10-15 15:17:03
尤其是WeakReference
和WeakHashMap
的一种常见用法是向对象添加属性。有时,你想给对象添加一些功能或数据,但是子类化和/或组合不是一个选项,在这种情况下,显而易见的事情是创建一个哈希图,将你想要扩展的对象链接到你想要添加的属性。然后,当您需要该属性时,您可以在地图中查找它。但是,如果要添加属性的对象往往会被销毁并大量创建,则最终会导致地图中的许多旧对象占用大量内存。
如果您使用WeakHashMap
,那么一旦程序的其余部分不再使用这些对象,这些对象就会离开您的地图,这是所需的行为。
我必须这样做,以便向java.awt.Component
添加一些数据,以绕过JRE1.4.2和1.5之间的变化,我可以通过对每个我感兴趣的组件(JButton
,JFrame
,JPanel
...)进行子类化来修复它。但用更少的代码,这就容易多了。
发布于 2008-09-30 20:05:13
例如,如果您想要跟踪某个类创建的所有对象。为了仍然允许对这些对象进行垃圾回收,您需要保留对这些对象的弱引用的列表/映射,而不是对象本身。
现在如果有人能向我解释幻影的引用,我会很高兴...
发布于 2008-10-01 07:53:00
如上所述,只要强引用存在,弱引用就会一直存在。
一个示例用法是在侦听器中使用WeakReference,这样一旦对其目标对象的主要引用消失,侦听器就不再活动。请注意,这并不意味着将WeakReference从listeners列表中删除,仍然需要清理,但可以在计划的时间执行。这还可以防止侦听的对象持有强引用,并最终成为内存膨胀的来源。示例:引用生命周期比窗口更长的模型的Swing GUI组件。
在使用如上所述的侦听器时,我们很快意识到,从用户的角度来看,对象是“立即”收集的。
https://stackoverflow.com/questions/154724
复制相似问题