写点什么

HashSet 与 WeakHashMap 的理解

作者:源字节1号
  • 2022 年 6 月 18 日
  • 本文字数:695 字

    阅读完需:约 2 分钟

HashSet与WeakHashMap的理解

HashSet 是如何实现的?

HashSet 是对 HashMap 的简单包装,对 HashSet 的函数调用都会转换成合适的 HashMap 方法

//HashSet是对HashMap的简单包装public class HashSet<E>{	......	private transient HashMap<E,Object> map;//HashSet里面有一个HashMap    // Dummy value to associate with an Object in the backing Map    private static final Object PRESENT = new Object();    public HashSet() {        map = new HashMap<>();    }    ......    public boolean add(E e) {//简单的方法转换        return map.put(e, PRESENT)==null;    }    ......}
复制代码

什么是 WeakHashMap?

我们都知道 Java 中内存是通过 GC 自动管理的,GC 会在程序运行过程中自动判断哪些对象是可以被回收的,并在合适的时机进行内存释放。GC 判断某个对象是否可被回收的依据是,是否有有效的引用指向该对象。如果没有有效引用指向该对象(基本意味着不存在访问该对象的方式),那么该对象就是可回收的。这里的有效引用 并不包括弱引用。也就是说,虽然弱引用可以用来访问对象,但进行垃圾回收时弱引用并不会被考虑在内,仅有弱引用指向的对象仍然会被 GC 回收

WeakHashMap 内部是通过弱引用来管理 entry 的,弱引用的特性对应到 WeakHashMap 上意味着什么呢?

WeakHashMap 里的entry可能会被 GC 自动删除,即使程序员没有调用remove()或者clear()方法。

WeakHashMap 的这个特点特别适用于需要缓存的场景。在缓存场景下,由于内存是有限的,不能缓存所有对象;对象缓存命中可以提高系统效率,但缓存 MISS 也不会造成错误,因为可以通过计算重新得到。


如若转载,请注明出处:开源字节   https://sourcebyte.cn/article/164.html

用户头像

源字节1号

关注

一个着迷于技术又喜欢不断折腾的技术活跃者 2022.03.09 加入

一个着迷于技术又喜欢不断折腾的技术活跃者。喜欢并热爱编程,执着于努力之后所带来的美好生活!

评论

发布
暂无评论
HashSet与WeakHashMap的理解_源字节1号_InfoQ写作社区