您当前的位置:首页 > 互联网教程

Map 和 WeakMap 的差异

发布时间:2025-05-21 17:17:40    发布人:远客网络

Map 和 WeakMap 的差异

一、Map 和 WeakMap 的差异

1、 Map和WeakMap的差异啊,差了个单词呗。(好了,本文完)

2、好了,我们来正儿八经的分析一波。

3、(10) Map.prototype[@@iterator]()

4、(1) WeakMap.prototype.delete()

5、可以看出 weakMap api少了 clear, entries,forEach,keys,values,以及获取iterator对象的方法,另外 weakMap还没有 size属性,无法获取内部存了多少个映射。

6、 Map可以用JS的任意类型作为键。 WeakMap的话只能是对象。

7、当把a, b都设置成null之后,GC会回收weakMap中的b对象对应的键值对(这里的意思是键和值都回收),也就是{ y: 13}这个对象会被回收,'14'这个常量也会被清除。但是不会回收Map中a对象对应的键值对,也就是{x: 12}这个对象并不会回收。

8、 WeakMap中值被回收,是因为键被回收了

9、 Map的使用,用在值需要频繁的删改的场景(map有优化),以及键只能是对象的场景比较优。如果只是简单的记录值而且键不会是对象的情况,用普通对象就OK了。

二、弱引用之WeakMap和WeakRef

1、弱引用:只要有对象引用,他就不会被垃圾回收。

2、介绍之前,不了解这些概念的同学可以参考一下以下链接。

3、 WeakMap:weakMap.set(ref, realData)这边针对的是对键的弱引用。可以理解为是向对象 ref中添加值为 realData的内容,通过ref来获取realData,一旦不再持有对象的引用,即使你仍持有添加了该对象的 WeakMap的引用对象,也会被垃圾回收。

4、 WeakRef:允许您保留对另一个对象的弱引用,而不会阻止被弱引用对象被GC回收。-没有很理解

5、 FinalizationGroup API可以注册一个回调,以便在垃圾回收器回收已注册的对象时运行。可以手动写一个回调函数用来做垃圾回收。

6、参考文章:

三、weakhashmap和hashmap的区别

1.HashMap是基于Key-Value的散列表(JDK7:数组+链表,JDK8:数组+链表+红黑树),采用拉链法实现的。一般用于单线程当中,非线程安全,HashMap的键是"强键"。

2.继承于抽象类AbstractMap,并且实现Map接口。遍历时,取得的数据完全是随机的。

3.默认容量大小是16,加载因子是0.75。

4.最多只允许一条key为Null,允许多条value为Null。

5.HashMap实现了Cloneable和Serializable接口,而WeakHashMap没有。

1).HashMap实现Cloneable,说明它能通过clone()克隆自己。

2).HashMap实现Serializable,说明它支持序列化,能通过序列化去传输。

6.添加、删除操作时间复杂度都是O(1)。

1.weakHashMap是基于Key-Value的散列表(数组+链表),采用拉链法实现的。一般用于单线程当中,非线程安全,weakHashMap中的键是"弱键"。

备注:当"弱键"被GC会收时,它对应的键值也会从weakHashMap中删除。

2.继承于抽象类AbstractMap,并且实现Map接口。

3.默认容量大小是16,加载因子是0.75。

4.最多只允许一条key为Null,允许多条value为Null。