面试题答案
一键面试1. WeakHashMap内部实现原理
- 数据结构:WeakHashMap 内部使用数组加链表(JDK 1.7 及之前)或数组加链表/红黑树(JDK 1.8 及之后)的数据结构,类似于 HashMap。数组用于存储哈希桶,每个桶中存放链表节点(当链表长度超过阈值时,在 JDK 1.8 及之后会转换为红黑树以提高查找效率)。
- 哈希算法:与 HashMap 类似,通过对 key 的 hashCode() 方法返回值进行一系列位运算来确定其在数组中的位置。具体是先对 hashCode 进行扰动处理(JDK 1.8 中是
h ^ (h >>> 16)
),然后与数组长度减一进行按位与操作((n - 1) & hash
)以得到桶的索引。 - 弱引用的处理方式:WeakHashMap 的 key 是弱引用类型。当 key 所指向的对象在系统中没有其他强引用指向它时,在下一次垃圾回收时,这个 key 所对应的对象会被回收。当垃圾回收发生后,WeakHashMap 会在下次访问(如 get、put 等操作)时检测到 key 已被回收,进而将对应的 entry 从 WeakHashMap 中移除。
2. 高并发且内存敏感场景下的性能优化
- 减少不必要的同步开销:虽然 WeakHashMap 本身不是线程安全的,但在高并发场景下可以使用
ConcurrentHashMap
结合弱引用机制来模拟类似功能。ConcurrentHashMap
内部采用分段锁(JDK 1.7)或 CAS 操作和 synchronized 关键字(JDK 1.8)来实现高效的并发访问,避免了全表锁带来的性能开销。 - 优化垃圾回收频率:由于 WeakHashMap 依赖垃圾回收来清理无效的 entry,频繁的垃圾回收会影响性能。可以通过调整 JVM 堆参数(如
-Xmx
、-Xms
等),使堆大小更适合应用场景,减少垃圾回收频率。同时,选择合适的垃圾回收器(如 G1 回收器在高并发、内存敏感场景下有较好的性能)也能优化垃圾回收性能。 - 控制数据规模:在内存敏感场景下,要严格控制 WeakHashMap 中数据的规模。可以设置一个合理的阈值,当 WeakHashMap 的大小接近这个阈值时,主动清理一些长时间未使用的 entry,例如可以使用定时任务定期遍历 WeakHashMap,移除那些很久未被访问的 entry。
- 缓存清理策略优化:在高并发场景下,当垃圾回收清理掉 key 对应的对象后,WeakHashMap 下次访问才会移除对应的 entry。可以考虑主动定期扫描 WeakHashMap,提前清理无效的 entry,以减少空间浪费和提高查找效率。