Set、Map、WeakSet、WeakMap详细介绍

2023-11-10 02:12

本文主要是介绍Set、Map、WeakSet、WeakMap详细介绍,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Set是一种类似于数组的数据结构,它存储唯一值,不允许重复。可以使用add()、delete()和has()方法来操作集合中的元素。Set中的值是无序的,可以通过迭代器进行遍历。

优点

  • 快速查找元素是否存在。
  • 去重。

缺点

  • 不能直接通过索引访问元素。

使用场景

去重:可以使用Set来快速去除数组中的重复元素。

判断元素是否存在:可以使用Set来判断某个元素是否存在于集合中。

// 去重
const arr = [1, 2, 3, 3, 4, 5, 5];
const uniqueSet = new Set(arr);
console.log([...uniqueSet]); // [1, 2, 3, 4, 5]
// 判断元素是否存在
const set = new Set([1, 2, 3]);
console.log(set.has(2)); // true
console.log(set.has(4)); // false

二、Map

Map是一种键值对存储数据的数据结构,类似于对象。每个键对应一个值。可以使用set()、get()、delete()和has()等方法来操作键值对。

优点

  • 可以使用任何类型作为键。
  • 提供了丰富的方法来操作键值对。

缺点

  • 相对于对象,Map的性能稍差。

使用场景

存储和查找数据:可以使用Map来存储和查找数据,键值对的形式更加直观和灵活。

// 存储和查找数据
const map = new Map();
map.set('name', 'John');
map.set('age', 30);
console.log(map.get('name')); // John
// 遍历键值对
for (let [key, value] of map) {console.log(key + ' = ' + value);
}

三、WeakSet

WeakSet是一种特殊的Set,它只能存储对象,并且对象是弱引用关联的。WeakSet中存储的对象是弱引用关联的,即如果没有其他引用指向该对象,则该对象会被垃圾回收。WeakSet没有迭代器,不能遍历其中的元素。

优点

  • 不会造成内存泄漏:由于WeakSet中存储的对象是弱引用关联的,不会阻止被引用对象被垃圾回收。

缺点

  • 功能较弱:由于无法遍历和获取大小等限制,功能相对有限。

使用场景

存储临时数据:可以使用WeakSet来存储临时数据,不用担心内存泄漏的问题。

// 存储临时数据
let obj1 = { name: 'John' };
let obj2 = { name: 'Jane' };
const weakSet = new WeakSet([obj1, obj2]);
// 注意:WeakSet没有迭代器,不能遍历其中的元素

四、WeakMap

WeakMap是一种特殊的Map,它只能使用对象作为键,并且键是弱引用关联的。WeakMap中使用的对象作为键是弱引用关联的,即如果没有其他引用指向该对象,则该对象会被垃圾回收。WeakMap没有迭代器,不能遍历其中的键值对。

优点

  • 不会造成内存泄漏:由于WeakMap中使用的对象作为键是弱引用关联的,不会阻止被引用对象被垃圾回收。

缺点

  • 功能较弱:由于无法遍历和获取大小等限制,功能相对有限。

使用场景

存储私有数据:可以使用WeakMap来存储私有数据,只有拥有对应的键才能访问到私有数据。

// 存储私有数据
let privateData = new WeakMap()
class Person {constructor(name) {privateData.set(this, { name })}getName() {return privateData.get(this).name}
}
let person = new Person("John")
console.log(person.getName()) // John
// 注意:WeakMap没有迭代器,不能遍历其中的键值对

总结

通过以上代码示例,我们可以看到Set、Map、WeakSet和WeakMap的用法和特性。

在Set和Map中,如果一个对象被添加到集合中,即使在其他地方不再引用该对象,它仍然会被集合保留,不会被垃圾回收机制回收。这可能导致内存泄漏,特别是在长时间运行的应用程序中。

而在WeakSet和WeakMap中,存储的对象是弱引用关联的。这意味着如果一个对象只有在WeakSet或WeakMap中存在引用,并且没有其他地方引用它,那么该对象将被垃圾回收机制自动回收。这样可以有效地避免内存泄漏问题。

另外,由于弱引用关联的特性,WeakSet和WeakMap没有提供像Set和Map那样的迭代器方法来遍历元素。也没有size属性来获取元素个数。这是为了确保不会干扰垃圾回收机制对对象的处理。

因此,当需要存储临时数据或私有数据,并且希望避免内存泄漏时,使用WeakSet和WeakMap是更合适的选择。它们提供了一种轻量级、安全且不会造成内存泄漏的数据存储方式。

这篇关于Set、Map、WeakSet、WeakMap详细介绍的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/379809

相关文章

Python进阶之Excel基本操作介绍

《Python进阶之Excel基本操作介绍》在现实中,很多工作都需要与数据打交道,Excel作为常用的数据处理工具,一直备受人们的青睐,本文主要为大家介绍了一些Python中Excel的基本操作,希望... 目录概述写入使用 xlwt使用 XlsxWriter读取修改概述在现实中,很多工作都需要与数据打交

java脚本使用不同版本jdk的说明介绍

《java脚本使用不同版本jdk的说明介绍》本文介绍了在Java中执行JavaScript脚本的几种方式,包括使用ScriptEngine、Nashorn和GraalVM,ScriptEngine适用... 目录Java脚本使用不同版本jdk的说明1.使用ScriptEngine执行javascript2.

Java操作PDF文件实现签订电子合同详细教程

《Java操作PDF文件实现签订电子合同详细教程》:本文主要介绍如何在PDF中加入电子签章与电子签名的过程,包括编写Word文件、生成PDF、为PDF格式做表单、为表单赋值、生成文档以及上传到OB... 目录前言:先看效果:1.编写word文件1.2然后生成PDF格式进行保存1.3我这里是将文件保存到本地后

windows系统下shutdown重启关机命令超详细教程

《windows系统下shutdown重启关机命令超详细教程》shutdown命令是一个强大的工具,允许你通过命令行快速完成关机、重启或注销操作,本文将为你详细解析shutdown命令的使用方法,并提... 目录一、shutdown 命令简介二、shutdown 命令的基本用法三、远程关机与重启四、实际应用

Python实现NLP的完整流程介绍

《Python实现NLP的完整流程介绍》这篇文章主要为大家详细介绍了Python实现NLP的完整流程,文中的示例代码讲解详细,具有一定的借鉴价值,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1. 编程安装和导入必要的库2. 文本数据准备3. 文本预处理3.1 小写化3.2 分词(Tokenizatio

使用SpringBoot创建一个RESTful API的详细步骤

《使用SpringBoot创建一个RESTfulAPI的详细步骤》使用Java的SpringBoot创建RESTfulAPI可以满足多种开发场景,它提供了快速开发、易于配置、可扩展、可维护的优点,尤... 目录一、创建 Spring Boot 项目二、创建控制器类(Controller Class)三、运行

springboot整合gateway的详细过程

《springboot整合gateway的详细过程》本文介绍了如何配置和使用SpringCloudGateway构建一个API网关,通过实例代码介绍了springboot整合gateway的过程,需要... 目录1. 添加依赖2. 配置网关路由3. 启用Eureka客户端(可选)4. 创建主应用类5. 自定

最新版IDEA配置 Tomcat的详细过程

《最新版IDEA配置Tomcat的详细过程》本文介绍如何在IDEA中配置Tomcat服务器,并创建Web项目,首先检查Tomcat是否安装完成,然后在IDEA中创建Web项目并添加Web结构,接着,... 目录配置tomcat第一步,先给项目添加Web结构查看端口号配置tomcat    先检查自己的to

使用Nginx来共享文件的详细教程

《使用Nginx来共享文件的详细教程》有时我们想共享电脑上的某些文件,一个比较方便的做法是,开一个HTTP服务,指向文件所在的目录,这次我们用nginx来实现这个需求,本文将通过代码示例一步步教你使用... 在本教程中,我们将向您展示如何使用开源 Web 服务器 Nginx 设置文件共享服务器步骤 0 —

SpringBoot集成SOL链的详细过程

《SpringBoot集成SOL链的详细过程》Solanaj是一个用于与Solana区块链交互的Java库,它为Java开发者提供了一套功能丰富的API,使得在Java环境中可以轻松构建与Solana... 目录一、什么是solanaj?二、Pom依赖三、主要类3.1 RpcClient3.2 Public