Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $YECBGYFECGEAFWHA as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2

Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $BBWFDDBHHYHDXXAB as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2
Why Sethas() is Faster Than Arrayincludes() for Finding Items_创想鸟

Why Sethas() is Faster Than Arrayincludes() for Finding Items

why sethas() is faster than arrayincludes() for finding items

有时,在构建应用程序时,性能最终成为关键或至少是重要的驱动因素,特别是在处理大型数据集或实时要求时。 javascript 中最常见的任务之一是检查集合中是否存在某个值。最常用的两个替代方法是 array.includes() 和 set.has()。两者都有效,但实际上,set.has() 比 array.includes 效果更好。让我们深入探讨其原因,并决定何时应该使用任一替代方案。

理解 array.includes() 与 set.has()

有两个方法看起来用法相当简单,但实现不同,即 array.includes() 和 set.has()。

array.includes()

includes() 方法检查给定值是否存在于数组中。
它利用了 o(n) 的时间复杂度,使得数组长度越大,检查值所需的时间就越长。
这是因为 array.includes() 从头到尾搜索数组(或直到找到值),数组越大,花费的时间越长。

set.has()

set 的 has() 方法也会检查给定值是否存在,但速度要快得多。
set.has() 依赖于基于哈希表的结构,该结构允许恒定时间查找,或 o(1) 时间复杂度。
与数组不同,集合是为处理唯一值而构建的,因此它内部不会有重复的值,并且具有更多的查找时间。

为什么 set.has() 对于大型数据集更快

当您使用 set.has() 时,javascript 可以通过一次直接操作找到该项目,无论集合中有多少项目。例如,在检查某个值是否在包含一百万的集合中时,set.has() 消耗的时间将与检查十完全相同。

另一方面,array.includes() 从左到右顺序检查每个元素,直到找到感兴趣的项目或到达其末尾。这意味着它的大小越长,检查时间就越长,特别是在项目接近尾部的情况下,而且肯定是当有问题的项目不存在时。

下面是一个详细的例子:

const bigarray = array.from({ length: 1000000 }, (_, i) => i);const bigset = new set(bigarray);const valuetofind = 999999;// array.includes (o(n)) - slower for large arraysconsole.time("array.includes");bigarray.includes(valuetofind);console.timeend("array.includes");// set.has (o(1)) - faster for large setsconsole.time("set.has");bigset.has(valuetofind);console.timeend("set.has");

当您运行此命令时,您会发现 set.has() 在大型数组上的性能远远优于 array.includes()。实际上,这种差异很可能会转化为更流畅的动画、更快的加载时间,甚至更少的服务器资源使用。

何时使用 set.has() 和 array.includes()

这一切都取决于您想要实现的目标。简单总结如下:

使用 set.has() 如果: -您正在处理大数据并进行大量查找。

-您正在使用唯一值,例如一组唯一的用户 id,
标签或关键字。

-您不介意将数组转换为
的少量前期成本 设置为尽量减少以后的查找次数。

使用 array.includes() 如果:– 你的数据集很小,性能差异是 可以忽略不计。

-您只需检查某个项目一次或几次,因此没有
创建集合的好处。

-您正在处理重复项,这是集合无法处理的。

示例用例

假设您正在实现一个用户搜索功能,根据阻止的单词列表过滤姓名。如果您有数百个被阻止的单词并且经常搜索,则对被阻止的单词使用集合可以使每次搜索检查更快:

const blockedWords = new Set(["spam", "test", "fakeuser", "bot"]); // Small data, but scales wellconst username = "fakeuser42";if (blockedWords.has(username)) {  console.log("Username is blocked");} else {  console.log("Username is allowed");}

即使在较小的情况下,set 也有助于保持事情的高效性和可预测性。另外,如果阻止的单词列表增长,您就已经拥有了一个可扩展的解决方案。

要点

性能:set.has() 提供 o(1) 时间复杂度,对于较大的集合来说,它比 array.includes() (o(n)) 快得多

适用性:集合是为唯一值而设计的,因此它自然地针对查找进行了优化。数组对于重复值更灵活,但在检查是否存在时速度较慢。

可扩展性:随着数据的增长,set.has() 继续表现良好,而 array.includes() 会变慢。

最后的想法

在 set.has() 和 array.includes() 之间进行选择时,了解数据集的大小和性质始终很重要。 array.includes() 非常适合小型数据集,但 set.has() 在速度至关重要的情况下是一个宝贵的工具。正确的数据结构可以帮助优化您的 javascript 应用程序,使其更快、更高效,而无需对代码进行重大更改。

因此,每当你发现自己在检查某个东西是否存在时,你应该问自己:这是数组的工作,还是我可以使用集合的力量?正确处理很可能就是您的应用程序所需要的不同。

以上就是Why Sethas() is Faster Than Arrayincludes() for Finding Items的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1495035.html

赞 (0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
JavaScript中如何获取包含空元素的数组的空元素个数?
上一篇 2025年12月19日 17:05:31
.NET WebAPI 图片上传为何出现 provider.FileData[0] 为 0?
下一篇 2025年12月19日 17:05:51

相关推荐

  • Maven多模块项目:跨模块资源文件访问与管理

    Maven多模块项目:跨模块资源文件访问与管理Maven多模块项目:跨模块资源文件访问与管理Maven多模块项目:跨模块资源文件访问与管理Maven多模块项目:跨模块资源文件访问与管理

    本文旨在解决Maven多模块项目中跨模块访问资源文件的常见问题。通过深入探讨Maven的依赖管理机制,我们将阐述如何将一个模块的资源纳入另一个模块的类路径,并利用ClassLoader.getResourceAsStream()方法安全、高效地读取这些资源,从而避免手动复制文件,提升项目可维护性。 …

    2026年9月30日 • 用户投稿
    600
  • Sublime写文本挖掘项目流程示范_从语料清洗到词频统计全覆盖

    Sublime写文本挖掘项目流程示范_从语料清洗到词频统计全覆盖Sublime写文本挖掘项目流程示范_从语料清洗到词频统计全覆盖Sublime写文本挖掘项目流程示范_从语料清洗到词频统计全覆盖Sublime写文本挖掘项目流程示范_从语料清洗到词频统计全覆盖

    sublime text在文本挖掘中的独特优势在于其高效的文本编辑能力与轻量级快速启动特性,使其成为处理大规模文本、编写脚本和查看中间结果的理想工具。1. 语料清洗流程包括编码统一、去除噪声、文本规范化、分词、停用词过滤等步骤;2. sublime用于浏览原始文本、编写python脚本、手动调整正则…

    2026年9月30日 • 用户投稿
    200
  • Kafka批处理监听器中反序列化异常的重试策略与实现

    Kafka批处理监听器中反序列化异常的重试策略与实现Kafka批处理监听器中反序列化异常的重试策略与实现Kafka批处理监听器中反序列化异常的重试策略与实现Kafka批处理监听器中反序列化异常的重试策略与实现

    本文详细介绍了如何在Spring Kafka批处理监听器中有效处理并重试反序列化异常。通过修改DefaultErrorHandler以取消对DeserializationException的致命标记,并结合监听器内部对带有null载荷的消息进行异常信息提取和重新抛出,实现对整个批次消息的重试,从而提…

    2026年9月27日 • 用户投稿
    100
  • Linux 信号

    linux 系统的进程间通信(inter-process communication, ipc)机制包括6种主要类型: 管道(PIPE)、信号(Signal)、命名管道(FIFO)、消息队列(Message Queue)、套接字(Socket)和共享内存(Shared Memory)。信号(Sign…

    2026年9月27日
    100
  • 云原生Java监控全套方案:从Micrometer到Grafana可视化看板

    云原生Java监控全套方案:从Micrometer到Grafana可视化看板云原生Java监控全套方案:从Micrometer到Grafana可视化看板云原生Java监控全套方案:从Micrometer到Grafana可视化看板云原生Java监控全套方案:从Micrometer到Grafana可视化看板

    云原生Java监控方案以Micrometer收集指标,Prometheus存储查询,Grafana实现可视化。Micrometer提供供应商中立的API,与Spring Boot Actuator集成,自动暴露JVM、HTTP等指标;通过micrometer-registry-prometheus依…

    2026年9月26日 • 用户投稿
    100
  • MongoDB在Debian上如何进行集群搭建

    在debian上搭建mongodb集群涉及多个步骤,包括安装、配置、启动各个组件以及设置副本集和分片。以下是一个基本的指南: 1. 安装MongoDB 首先,确保你的Debian系统是最新的,然后安装MongoDB。 sudo apt updatesudo apt upgradesudo apt i…

    2026年9月24日
    300
  • 解决Android设备管理移除时的SecurityException

    本文将详细介绍如何解决在尝试从Android设备移除设备管理员时遇到的java.lang.SecurityException异常。该异常通常发生在尝试移除一个非测试用途的设备管理员应用时。通过修改应用的配置,将其临时标记为测试应用,可以绕过此安全限制,从而成功移除设备管理员。请务必注意,这种方法仅适…

    2026年9月22日
    200
  • 构建Spring自定义Kafka配置的注解式解决方案

    本文探讨了在Spring Boot应用中通过自定义注解实现Kafka配置自动化时遇到的挑战,特别是由于Bean注册时机不当导致的依赖注入失败。我们将深入分析问题根源,并提供两种核心解决方案:利用META-INF/spring.factories实现标准化的自动配置发现,以及通过ImportBeanD…

    2026年9月21日
    1200
  • 如何在Linux中自动重启 Linux systemd自动恢复

    答案:通过配置systemd服务文件中的Restart、RestartSec、WatchdogSec及StartLimitInterval等参数,可实现Linux服务的自动重启与看门狗监控,并避免无限重启循环,提升系统稳定性。 在Linux中,可以通过systemd来实现服务的自动重启,确保服务在崩…

    2026年9月20日
    000
  • 监控工具(Prometheus+Grafana)配置

    使用prometheus和grafana可以构建高效的监控系统。1) 配置prometheus收集指标数据,通过prometheus.yml文件定义监控目标和抓取间隔。2) 使用grafana可视化数据,添加prometheus作为数据源并创建仪表板展示关键指标。 在现代的软件开发和运维中,监控系统…

    2026年9月20日
    000
  • Linux如何查看当前运行的所有进程

    答案是使用ps、top和htop命令查看Linux系统中的进程。ps aux或ps -ef可列出所有进程的静态信息,top提供实时动态监控,htop则以更友好的界面增强交互体验;结合grep、pgrep等工具可按名称或用户筛选进程,通过STAT状态码可判断进程是否异常,配合iotop、free等工具…

    2026年9月20日
    000
  • 如何在Linux中进程冻结 Linux cgroup freezer使用

    Linux中使用cgroup freezer可精细冻结进程,需先挂载freezer子系统,创建cgroup目录,将进程PID写入tasks文件,再通过写FROZEN到freezer.state实现冻结,THAWED恢复,操作需root权限,注意v1与v2版本路径及控制方式差异。 Linux中要冻结进…

    2026年9月20日
    100
  • LINUX怎么结束一个进程_Linux终止进程的kill命令使用方法

    结束进程应先查PID再选信号,优先用kill PID发送SIGTERM(15)让进程正常退出,无响应时再用kill -9 PID发送SIGKILL(9)强制终止,避免直接使用-9导致数据丢失或系统不稳定。 在Linux系统中,结束一个进程最常用的方式是使用kill命令。它通过向指定进程发送信号来控制…

    2026年9月12日
    200
  • Spring Data JPA 忽略数据库默认值问题及解决方案

    本文旨在解决在使用 Spring Data JPA 时,数据库表字段的默认值被覆盖的问题。我们将探讨 JPA 默认行为,并提供使用 `@Generated` 注解来确保数据库默认值生效的解决方案。通过本文,你将了解如何在 Spring Data JPA 应用中正确处理数据库默认值,避免数据不一致的问…

    2026年9月12日
    000
  • Swoole如何实现动态配置?配置如何实时更新?

    Swoole实现动态配置需依赖配置源与分发机制,通过定时轮询或事件驱动推送更新Worker进程配置,结合版本控制、原子性操作及平滑重启策略,确保配置实时生效与服务稳定性。 Swoole要实现动态配置和配置的实时更新,核心在于利用其进程常驻的特性,结合外部配置中心或简单的存储机制,并通过Swoole提…

    2026年9月11日
    300
  • Jlink构建Java应用MBeans管理与JConsole连接指南

    本文详细阐述了jlink构建的java应用在jconsole连接时遇到的模块缺失问题及其解决方案。通过利用jdeps工具精确识别并添加所有必需的运行时模块,包括管理扩展,确保自定义运行时镜像能够完整支持mbeans功能,从而实现jconsole的顺利连接和监控。教程提供了jdeps和jlink的详细…

    2026年9月11日
    200
  • Linux进程状态详解:运行、睡眠、僵尸进程等

    Linux进程状态包括运行(R)、睡眠(S/D)、停止(T/t)、僵尸(Z)等,反映进程执行情况;通过ps或top命令查看STAT列,可诊断CPU压力、I/O阻塞、资源泄漏等问题,助力系统性能调优。 在Linux系统中,进程是程序执行的基本单位。每个进程在其生命周期中会经历不同的状态,这些状态反映了…

    2026年9月9日
    300
  • 灵活配置TYPO3:SourceBroker/configs 的妙用

    在维护多个 typo3 实例时,常常面临一个难题:每个实例的数据库连接、缓存设置、图片处理路径等配置都可能不同。如果直接在代码中硬编码这些配置,不仅难以维护,而且容易出错。更糟糕的是,每次部署都需要修改代码,这无疑增加了工作量和出错的风险。 为了解决这个问题,我尝试过多种方法,例如使用不同的配置文件…

    用户投稿 2026年9月4日
    100
  • 灵活的路由配置:RollerworksRouteAutowiringBundle 的实践指南

    在开发一个大型 symfony 应用时,我们通常会将应用拆分成多个模块(bundle)。每个模块都拥有自己的路由配置,传统的做法是将这些路由配置分别定义在各个模块中,然后在主应用的路由配置文件中逐一导入。这种方法存在一些问题: 维护成本高: 随着模块数量的增加,主应用的路由配置文件会变得越来越臃肿,…

    用户投稿 2026年9月4日
    800
  • 快速构建API:使用zf3belcebur/doctrine-orm-fast-api库的体验分享

    在开发过程中,我们经常需要快速构建一个api来处理crud操作,尤其是在使用doctrine orm时。传统的方法需要手动编写大量的控制器和路由代码,这不仅耗时,而且容易出错。最近,我在项目中遇到了同样的问题,经过一番探索,我发现了zf3belcebur/doctrine-orm-fast-api这…

    用户投稿 2026年9月3日
    700

发表回复

登录后才能评论
关注微信