- 简述WeakHashMap的工作原理
弱键(Weak Keys):
WeakHashMap 的键(keys)是通过 WeakReference 弱引用进行封装的。弱引用是一种特殊的引用类型,它不会阻止所引用的对象被垃圾收集器回收。这意味着,如果一个键对象除了作为 WeakHashMap 的键之外没有任何强引用指向它,那么在进行垃圾回收时,这个键对象可以被当作垃圾回收,即使它还在 WeakHashMap 中。
键值对存储:
WeakHashMap 内部采用类似于 HashMap 的数据结构来存储键值对,即一个哈希表(数组加链表/红黑树)结构。每个键值对(Entry)被封装在一个 Entry 对象中,其中键是通过 WeakReference 引用的,而值则是直接引用的。这样设计使得值的生命周期不受键的影响,即使键被垃圾回收,只要还有其他强引用持有值,值本身不会被回收。
引用队列(ReferenceQueue):
当 WeakHashMap 创建键值对时,不仅为键创建了一个 WeakReference,还将其关联到一个 ReferenceQueue 上。当键对象因为没有其他强引用而被垃圾收集器回收时,其对应的 WeakReference 将被添加到这个引用队列中。
自动清理机制:
WeakHashMap 在进行诸如 get()、put() 等操作时,会检查引用队列中是否有被回收的键的 WeakReference。如果有,说明相应的键值对已经失去了键的引用,此时 WeakHashMap 会从内部哈希表中移除对应的 Entry,释放相关资源。这个过程通常称为“清理”或“整理”。
操作与同步:
与 HashMap 类似,WeakHashMap 的基本操作(如 put()、get()、remove())遵循类似的时间复杂度,即平均情况下接近 O(1),最坏情况下 O(n)。由于清理操作涉及到内部数据结构的修改,因此在多线程环境下,对 WeakHashMap 的操作通常需要适当的同步控制,尽管在 Java 8 及之后版本,JDK 提供了并发友好的 ConcurrentHashMap,但在某些特定场景下,开发者仍可能选择使用 WeakHashMap 并自行管理同步。
如果大家需要视频版本的讲解,欢迎关注我的B站: