面试题答案
一键面试WeakHashMap与垃圾回收关联的基本原理
- WeakHashMap概述:
WeakHashMap
是Java中的一种哈希表实现,它与普通HashMap
的关键区别在于其键是弱引用。这意味着当键对象除了在WeakHashMap
中作为键存在外,没有其他强引用指向它时,该键对象可能会被垃圾回收器回收。
- 垃圾回收机制基础:
- Java的垃圾回收器(GC)负责自动回收不再被程序使用的对象所占用的内存。GC主要通过跟踪对象的引用关系来判断对象是否可达。如果一个对象没有任何强引用指向它,那么它就成为垃圾回收的候选对象。
- WeakHashMap与垃圾回收关联:
- 在
WeakHashMap
中,键对象使用WeakReference
来包装。WeakReference
是一种弱引用类型,不会阻止对象被垃圾回收。当一个键对象在系统中没有其他强引用,并且垃圾回收器运行时,垃圾回收器会回收该键对象所占用的内存。同时,WeakHashMap
会在适当的时候(通常是在后续操作如调用get
、put
等方法时)检测到键对象已被回收,并相应地从映射中移除对应的键值对。
- 在
WeakHashMap的键与垃圾回收机制的相互作用
- 键的弱引用特性:
- 当向
WeakHashMap
中放入一个键值对时,键会被封装成一个WeakReference
对象。例如,如果有代码WeakHashMap<String, Integer> weakMap = new WeakHashMap<>(); weakMap.put("key", 1);
,这里的"key"
字符串对象会被包装成一个WeakReference
。 - 只要有其他强引用指向这个键对象,比如在其他地方定义了
String str = "key";
,那么这个键对象不会被垃圾回收。但如果str
被置为null
,且没有其他强引用指向"key"
对象,那么"key"
对象就有可能被垃圾回收。
- 当向
- 键被回收后的处理:
- 当键对象被垃圾回收后,
WeakHashMap
并不会立即移除对应的键值对。而是在WeakHashMap
执行某些操作(如get
、put
、remove
、size
等方法)时,会检测到键的WeakReference
已经失效(即键对象已被回收),此时WeakHashMap
会将对应的键值对从映射中移除。这确保了WeakHashMap
中不会包含指向已被回收键对象的无效引用。
- 当键对象被垃圾回收后,