面试题答案
一键面试WeakHashMap在内存管理方面的功能实现
- 弱引用机制:WeakHashMap使用弱引用(WeakReference)来存储键。当一个键对象在系统的其他地方没有强引用指向它时,在下一次垃圾回收时,这个键(及其对应的值)会被回收。例如,假设有如下代码:
WeakHashMap<MyKey, String> weakMap = new WeakHashMap<>();
MyKey key = new MyKey();
weakMap.put(key, "value");
key = null; // 移除对MyKey对象的强引用
// 当垃圾回收器运行时,若没有其他地方引用key,其对应的键值对可能会从WeakHashMap中移除
- 后台清理:WeakHashMap有一个后台线程(在某些实现中)或在每次调用
put
、get
等方法时检查并移除那些键已经被垃圾回收的条目。这种机制保证了WeakHashMap能及时释放不再被使用的键值对所占用的内存。
与普通HashMap在内存管理机制上的不同
- 键的引用类型:
- HashMap:HashMap使用强引用存储键。只要HashMap对象本身可达,并且键对象在HashMap中有强引用,那么键(及其对应的值)就不会被垃圾回收,即使在系统其他地方不再使用该键对象。例如:
HashMap<MyKey, String> hashMap = new HashMap<>();
MyKey key = new MyKey();
hashMap.put(key, "value");
key = null; // 虽然这里移除了对MyKey对象的外部强引用,但在HashMap中仍有强引用,该键值对不会被垃圾回收
- **WeakHashMap**:如上述所说,使用弱引用存储键,当键对象没有其他强引用时,可能会被垃圾回收。
2. 内存释放时机:
- HashMap:只有当HashMap对象本身不可达(例如被赋值为 null
且没有其他强引用指向它),或者显式地调用 clear()
方法移除所有元素时,HashMap占用的内存才会被回收。
- WeakHashMap:只要键对象失去强引用,就有可能在垃圾回收时被移除,从而释放内存,即使WeakHashMap对象本身仍然可达。