参考了网上不少的文章,总结如下:
WeakHashMap实现大部分与1.7版本的HashMap相同,但WeakHashMap中的Entry继承了WeakReference,key为弱引用。
弱引用对象在发生GC时会被回收,因此key被回收后会进入到ReferenceQueue中,注意这里回收的其实只是key,value没有被回收。
WeakHashMap的get()、put()等方法都直接或间接调用了expungeStaleEntries()方法,这个方法会从ReferenceQueue中拿到被回收掉的key,然后去遍历清除对应的值,帮助GC回收value。
对于HashMap,当kye为null时其hash为0,固定位置为table[0],而在WeakHashMap中null会被包装成static object NULL_KEY = new Object(),会正常的求hash等操作,由于NULL_KEY 是静态不在GC范围内,因此不会被回收,所以key为null的必须手动通过remove()来删除。
WeakHashMap
最新推荐文章于 2024-01-06 11:22:09 发布