猿问
下载APP

你什么时候使用WeakHashMap或WeakReference?

使用弱引用是我从未见过的实现,所以我试图弄清楚它们的用例是什么以及实现如何工作。什么时候需要使用WeakHashMap或者WeakReference它是如何使用的?



胡说叔叔
浏览 81回答 3
3回答

MM们

强引用的一个问题是缓存,特别是对于像图像这样的非常大的结构。假设您有一个必须使用用户提供的图像的应用程序,例如我工作的网站设计工具。当然,您希望缓存这些图像,因为从磁盘加载它们非常昂贵,并且您希望避免在内存中同时存储两个(可能是巨大的)图像副本的可能性。因为当我们不是绝对需要时,图像缓存应该阻止我们重新加载图像,你会很快意识到缓存应该总是包含对已经在内存中的任何图像的引用。但是,对于普通的强引用,引用本身会强制图像保留在内存中,这需要您以某种方式确定内存中何时不再需要该图像并将其从缓存中删除,以使其符合垃圾回收的条件。您被迫复制垃圾收集器的行为并手动确定对象是否应该在内存中。

智慧大石

要明确的一个区别是a WeakReference和a 之间的区别SoftReference。基本上WeakReference,一旦被引用的对象没有硬引用,JVM就会急切地想要GC-d 。一个SoftReference在另一方面d对象,往往会被垃圾收集器留约,直到它真正需要回收内存。将值保存在WeakReferences中的缓存将是非常无用的(在a中WeakHashMap,它是弱引用的键)。SoftReferences当您想要实现可以使用可用内存增长和缩小的缓存时,可以将值包装起来

慕丝7291255

WeakReferences和WeakHashMaps的一个常见用途是用于向对象添加属性。有时您希望向对象添加一些功能或数据,但子类和/或组合不是一个选项,在这种情况下,显而易见的事情是创建一个hashmap,将您想要扩展的对象链接到要添加的属性。然后,无论何时您需要房产,您都可以在地图上查找。但是,如果要添加属性的对象倾向于被破坏并创建很多,则最终可能会导致地图中的许多旧对象占用大量内存。如果您使用的WeakHashMap是对象,则只要程序的其余部分不再使用它们就会离开地图,这是所需的行为。我不得不这样做是为了增加一些数据,以java.awt.Component避开在1.4.2和1.5之间的JRE的变化,我可以通过继承每个组件我很感兴趣,INT(固定它JButton,JFrame,JPanel...),但是,这是多少使用更少的代码更容易。
打开App,查看更多内容
随时随地看视频慕课网APP
我要回答