面试题答案
一键面试WeakHashMap与普通HashMap内存管理机制的不同
- 键的引用类型:
- 普通HashMap:键对象使用强引用。只要HashMap对象存在且键对象被HashMap引用,键对象不会被垃圾回收器回收,即使在程序的其他地方不再有对键对象的引用。
- WeakHashMap:键对象使用弱引用。当键对象在程序的其他地方不再有强引用指向它时,在下一次垃圾回收时,WeakHashMap中的键(及对应的值)就可能被垃圾回收器回收,即使WeakHashMap对象仍然存在。
- 内存释放时机:
- 普通HashMap:只有当HashMap对象本身被垃圾回收(例如没有任何强引用指向HashMap对象),或者显式地调用
clear()
方法等清理操作时,才会释放键值对占用的内存。 - WeakHashMap:只要键对象失去外部强引用,垃圾回收器在运行时就可能回收键值对占用的内存,无需WeakHashMap对象被回收或显式清理。
- 普通HashMap:只有当HashMap对象本身被垃圾回收(例如没有任何强引用指向HashMap对象),或者显式地调用
选择使用WeakHashMap优化内存使用的场景
- 缓存场景:
- 当创建的缓存对象生命周期不希望影响被缓存对象的生命周期时,可使用WeakHashMap。例如,在一个图片缓存系统中,图片对象可能在其他地方被释放(比如用户关闭了显示图片的窗口),如果使用普通HashMap缓存图片,即使图片在其他地方不再被使用,由于HashMap的强引用,图片对象不会被回收。而WeakHashMap在图片失去其他强引用时,能及时回收缓存的图片,避免内存泄漏。
- 对象的临时关联:
- 某些情况下,需要临时关联一些对象,当这些对象在其他地方不再被使用时,希望其占用的内存能尽快释放。比如在一个Web应用中,临时关联用户会话和一些辅助信息,当用户会话结束(失去强引用),这些辅助信息也无需保留,使用WeakHashMap存储这种关联关系,能及时释放内存。