面试题答案
一键面试WeakHashMap在对象生命周期跟踪方面的原理
WeakHashMap使用弱引用(WeakReference)来跟踪键对象的生命周期。当一个键对象除了在WeakHashMap中作为键存在外,没有其他强引用指向它时,在下一次垃圾回收运行时,这个键对象会被回收,并且对应的键值对也会从WeakHashMap中移除。这是因为WeakHashMap内部使用了WeakReference类型来包装键对象,垃圾回收器在回收内存时,会检查这些弱引用。如果发现某个弱引用所指向的对象没有其他强引用,就会回收该对象,并将这个弱引用加入到一个引用队列(ReferenceQueue)中。WeakHashMap会定期检查这个引用队列,发现有已被回收的键的弱引用时,就从自身移除对应的键值对。
WeakHashMap与普通HashMap在存储键值对时,对于键对象的生命周期管理的不同
- 普通HashMap:普通HashMap对键对象使用强引用。只要键对象在HashMap中作为键存在,就会一直保持对它的强引用,即使在其他地方没有对该键对象的强引用,这个键对象也不会被垃圾回收,直到HashMap本身被销毁或者显式地移除该键值对。这意味着普通HashMap会阻止键对象被垃圾回收,可能导致内存泄漏,如果键对象比较大且不再被其他地方使用,但仍然在HashMap中被引用。
- WeakHashMap:WeakHashMap对键对象使用弱引用。当键对象在其他地方没有强引用时,垃圾回收器可以回收该键对象,同时WeakHashMap会从自身移除对应的键值对。这种方式适用于那些希望在键对象不再被其他地方使用时,能够自动从Map中移除,以避免内存泄漏的场景,例如缓存场景,当缓存中的对象不再被外部引用时,可以自动被清除。