鸿蒙开发进阶:深入解析ArkTS语言特性与高性能编程实践
一、前言
在鸿蒙生态蓬勃发展的当下,开发者对于高效、优质的应用开发语言需求愈发迫切。ArkTS 作为鸿蒙应用开发的核心语言,在继承 TypeScript 优势的基础上,进行了诸多优化与扩展,为开发者带来了全新的编程体验。本文将深入剖析 ArkTS 相较于 TypeScript 的特性差异,以及如何运用 ArkTS 实现高性能编程,助力开发者打造卓越的鸿蒙应用。
二、ArkTS 与 TypeScript 的渊源及特性差异
(一)技术演进脉络
TypeScript 由微软开发,作为 JavaScript 的超集,它引入了静态类型系统、接口、泛型等特性,旨在提升 JavaScript 代码的可维护性与可扩展性,让开发者在编码阶段就能发现潜在错误,降低运行时出错风险,尤其适用于大型项目开发。
ArkTS 则是华为专为鸿蒙操作系统打造的应用开发语言,基于 TypeScript 进行了深度定制与优化。它不仅继承了 TypeScript 的基本语法风格,还针对鸿蒙系统的特性与需求,强化了静态检查和分析机制,引入声明式 UI 范式、状态管理等专属能力,以实现更高效、稳定的应用开发。
(二)核心特性差异
- 类型系统强化
- 严格静态类型要求:TypeScript 虽支持静态类型,但并非强制使用,开发者仍可使用
any
类型绕过类型检查。而 ArkTS 强制要求所有类型在编译时明确已知,全面禁止使用any
和unknown
类型,极大增强了代码的可读性与可维护性,从根源减少运行时类型错误。例如在 TypeScript 中:
let value; // 未明确类型,默认推断为anyvalue = "string";value = 123; // 运行时不会报错
在 ArkTS 中,这样的代码会直接编译失败,必须显式声明类型:
let value: string;value = "string";// value = 123; 编译错误,类型不匹配
- 对象布局固定:ArkTS 规定对象布局在编译时确定且运行时不可变更,禁止动态添加、删除属性和方法,以及随意赋值不同类型值给对象属性。这一特性确保了内存布局稳定,提升运行效率。如在 TypeScript 中:
let obj = { prop: "initial" };obj.newProp = "added"; // 运行时可动态添加属性
ArkTS 中则不允许此类操作,对象定义后结构固定。
2. 语法与特性限制
- 不支持部分 TS 特性:ArkTS 舍弃了 TypeScript 中一些可能导致性能损耗或运行时不确定性的特性。例如,ArkTS 不支持
structural typing
,类型必须显式声明,不能通过接口隐式实现类型匹配。在 TypeScript 中:
interface Shape {area(): number;}class Circle {radius: number;constructor(radius: number) { this.radius = radius; }area() { return Math.PI \* this.radius \* this.radius; }
}let shape: Shape = new Circle(); // 允许,Circle隐式实现Shape接口
ArkTS 中则需显式声明类型实现:
interface Shape {area(): number;
}class Circle implements Shape {radius: number;constructor(radius: number) { this.radius = radius; }area() { return Math.PI \* this.radius \* this.radius; }
}let shape: Shape = new Circle(); // 明确实现接口
- 标准库使用限制:ArkTS 对标准库的使用有所限制,禁止使用 TypeScript 或 JavaScript 标准库中的某些接口,防止因引入不必要的动态特性影响性能。同时,ArkTS 在
import
语句方面也有严格规定,不允许在import
前使用其他语句,且.ets
文件可导入.ets
/.ts
/.js
文件源码,但.ts
/.js
文件不能导入.ets
文件源码,以此保障类型安全与代码结构清晰。
三、ArkTS 高性能编程实践指南
(一)优化渲染性能
- 声明式 UI 高效构建:ArkTS 的声明式 UI 范式以简洁直观的方式描述 UI 结构与状态,避免了命令式编程中频繁的 DOM 操作。通过状态驱动 UI 更新,当数据变化时,框架自动计算并最小化 UI 重绘区域。例如,构建一个简单的计数器组件:
@Entry
@Component
struct Counter {@State count: number = 0;build() {Column() {Text(`Count: ${this.count}`).fontSize(30);Button("Increment").onClick(() => this.count++).fontSize(20);}}
}
每次点击按钮,仅Text
组件中显示的计数部分更新,而非整个界面重绘,大大提升渲染效率。
2. 合理使用布局与组件:选择合适的布局容器(如Column
、Row
、Flex
等)能优化界面排版性能。避免过度嵌套布局,减少布局计算量。同时,对于频繁复用的 UI 部分,封装成自定义组件,利用组件的缓存机制提升渲染速度。例如,创建一个可复用的列表项组件:
@Component
struct ListItem {@Prop itemText: string;build() {Row() {Text(this.itemText).fontSize(20).margin(10);// 其他项内元素}}
}@Component
struct List {@State items: string\[] = \["Item1", "Item2", "Item3"];build() {Column() {ForEach(this.items, (item) => {ListItem({ itemText: item });})}}
}
(二)内存管理与优化
- 避免内存泄漏:ArkTS 中严格的对象生命周期管理有助于防止内存泄漏。确保及时释放不再使用的对象引用,特别是在使用事件监听、定时器等场景下。例如,添加事件监听后,在组件销毁时移除监听:
@Entry
@Component
struct MyComponent {private element: Element;build() {Column() {// 组件内容}.onCreate(() => {this.element = document.getElementById('myElement');this.element.addEventListener('click', this.handleClick.bind(this));}).onDestroy(() => {this.element.removeEventListener('click', this.handleClick.bind(this));});}handleClick() {// 处理逻辑}
}
- 优化数据结构使用:根据业务需求选择恰当的数据结构。对于频繁查找操作,使用
Map
或Set
;对于有序数据且需频繁插入、删除操作,考虑List
。避免创建过大或不必要的数据结构,减少内存占用。例如,若需存储唯一值集合,优先使用Set
:
let uniqueValues = new Set();uniqueValues.add(1);uniqueValues.add(2);if (uniqueValues.has(1)) {// 执行逻辑
}
(三)并发编程与性能提升
- 利用并发 API:ArkTS 增强了并发编程能力,引入
async
/await
、Promise
等机制,方便开发者处理异步任务,提升应用响应速度。例如,进行网络请求时:
async function fetchData(): Promise<any> {let response = await fetch('https://example.com/api/data');return response.json();
}async function main() {let data = await fetchData();// 处理数据
}
- 任务调度优化:合理安排并发任务数量,避免因过度并发导致资源竞争与性能下降。可使用
Promise.all
等方法控制多个异步任务并行执行,并在所有任务完成后统一处理结果。例如,同时请求多个接口:
async function fetchAllData() {let promise1 = fetch('https://api1.com/data');let promise2 = fetch('https://api2.com/data');let [response1, response2] = await Promise.all([promise1, promise2]);let data1 = await response1.json();let data2 = await response2.json();// 合并处理数据}
四、总结与展望
ArkTS 通过对 TypeScript 的优化与扩展,在类型系统、语法特性等方面形成了独特优势,为鸿蒙应用开发提供了坚实基础。在高性能编程实践中,开发者通过合理运用声明式 UI、优化内存管理与并发编程,能够显著提升应用性能与用户体验。随着鸿蒙生态不断壮大,ArkTS 也将持续演进,为开发者带来更多创新功能与优化策略,助力鸿蒙应用在各领域绽放光彩。建议开发者深入学习 ArkTS 特性,结合实际项目不断实践,在鸿蒙开发浪潮中抢占先机,创造出更多优质、高效的应用。
相关文章:
鸿蒙开发进阶:深入解析ArkTS语言特性与高性能编程实践
一、前言 在鸿蒙生态蓬勃发展的当下,开发者对于高效、优质的应用开发语言需求愈发迫切。ArkTS 作为鸿蒙应用开发的核心语言,在继承 TypeScript 优势的基础上,进行了诸多优化与扩展,为开发者带来了全新的编程体验。本文将深入剖析…...
现代计算机图形学Games101入门笔记(十七)
双向路径追踪 外观建模 散射介质 人的头发不能用在动画的毛发上。 动物的髓质Medulla特别大 双层圆柱模型应用 BSSRDF是BRDF的延伸。 天鹅绒用BRDF不合理,转成散射介质。 法线分布 光追很难处理微表面模型 光在微型细节上,光是一个波,会发生衍…...
工单派单应用:5 大核心功能提升协作效率
一、工单管理:全流程一目了然 快速创建:录入任务内容、优先级,从源头明确目标 状态分类:待处理 / 进行中 / 已完成工单一目了然,个人进度随时掌控 灵活分配:公海池抢单机制,成员按能力自主接…...
maven 多个模块之间互相引入加载配置的偶遇问题
因为子项目添加了:<!-- aliyun sms SDK --> <dependency><groupId>com.aliyun</groupId><artifactId>aliyun-java-sdk-core</artifactId><version>4.6.3</version> </dependency>导致原本运行良好的构建模块,…...
【蓝桥杯嵌入式】【模块】五、ADC相关配置及代码模板
1. 前言 最近在准备16届的蓝桥杯嵌入式赛道的国赛,打算出一个系列的博客,记录STM32G431RBT6这块比赛用板上所有模块可能涉及到的所有考点,如果有错误或者遗漏欢迎各位大佬斧正。 本系列博客会分为以下两大类: 1.1. 单独模块的讲…...
DP2 跳台阶【牛客网】
文章目录 零、原题链接一、题目描述二、测试用例三、解题思路四、参考代码 零、原题链接 DP2 跳台阶 一、题目描述 二、测试用例 三、解题思路 基本思路: 动态规划题目的难点基本在于构造状态转移方程,对应这题,我们可以发现每次跳跃我…...
KC 喝咖啡/书的复制/奶牛晒衣服/ 切绳子
二分的解题思路: 常解决最小值最大化和最大值最小化问题 步骤解析 确定答案范围 设定初始左边界 left 和右边界 right,确保解在此区间内。例如: 求最小最大值时,left 可取单个元素的最大值,right 取所有元素总和。 …...
Jedis快速入门【springboot】
引入依赖 <dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version>6.0.0</version> </dependency> 创立jedis对象,建立连接 private Jedis jedis; BeforeEach void setUp(){//1 …...
SpringBoot 商城系统高并发引起的库存超卖库存问题 乐观锁 悲观锁 抢购 商品秒杀 高并发
介绍 在高并发场景下,特别是商品秒杀、抢购等情况下,库存超卖问题是一个常见且棘手的问题。为了解决这个问题,Spring Boot 常使用乐观锁和悲观锁来保证数据的正确性和一致性。 悲观锁 悲观锁假设在多线程或多进程环境中,资源会被…...
[python] 轻量级定时任务调度库schedule使用指北
schedule是一款专为简化定时任务调度而设计的Python库,它通过直观的语法降低了周期性任务的实现门槛。作为进程内调度器,它无需额外守护进程,轻量且无外部依赖,适合快速搭建自动化任务。不过,该库在功能完整性上有所取…...
MySQL:to many connections连接数过多
当你遇到 MySQL: Too many connections 错误时,意味着当前连接数已达到 MySQL 配置的最大限制。这通常是由于并发连接过多或连接未正确关闭导致的。 一、查看当前连接数 查看 MySQL 当前允许的最大连接数 SHOW VARIABLES LIKE max_connections;查看当前使用的最大…...
uthash是一个非常轻量级的库
如大家所知,uthash是一个非常轻量级的库。该库的使用非常简单,无需格外的静态库或动态库,仅需导入目标的头文件即可。 这种配置方式虽然简单,但是使用操作却需要用到大量的宏函数。在使用宏函数时不像使用普通函数一样自由和遍历…...
大模型的开发应用(三):基于LlaMAFactory的LoRA微调(上)
基于LlaMAFactory的LoRA微调(上) 0 前言1 LoRA微调1 LoRA微调的原理1.2 通过peft库为指定模块添加旁支1.3 lora前后结构输出结果对比1.4 使用PyTorch复现 LoRA.Linear1.5 使用peft进行LoRA微调案例 2 LLaMA-Factory2.1 LLaMA-Factory简介2.2 LLaMA-Facto…...
跨域_Cross-origin resource sharing
同源是指"协议域名端口"三者相同,即便两个不同的域名指向同一个ip,也非同源 1.什么是CORS? CORS是一个W3C标准,全称是"跨域资源共享"(Cross-origin resource sharing)。它允许浏览器向跨源服务器ÿ…...
奥威BI:打破AI数据分析伪场景,赋能企业真实决策价值
在当今企业数字化转型的浪潮中,AI数据分析产品如雨后春笋般涌现,但许多看似创新的功能设计实则难以落地,沦为“伪需求场景”。这些伪场景不仅浪费企业资源,还可能误导决策,阻碍企业数字化转型进程。在此背景下…...
LLaMA-Factory全解析:大模型微调的开源利器与实战指
技术演进背景与核心价值架构设计与关键技术解析环境搭建与工具链配置全流程微调实战指南企业级应用与高级功能性能优化与安全部署未来发展趋势展望1. 技术演进背景与核心价值 1.1 大模型微调的技术痛点 当前开源大模型(如LLaMA、Qwen、Baichuan等)在通用领域表现优异,但垂…...
python-数据可视化(大数据、数据分析、可视化图像、HTML页面)
通过 Python 读取 XLS 、CSV文件中的数据,对数据进行处理,然后生成包含柱状图、扇形图和折线图的 HTML 报告。这个方案使用了 pandas 处理数据,matplotlib 生成图表,并将图表嵌入到 HTML 页面中。 1.XSL文件生成可视化图像、生成h…...
Jmeter(一) - 环境搭建
1.JMeter 介绍 Apache JMeter是100%纯JAVA桌面应用程序,被设计为用于测试客户端/服务端结构的软件(例如web应用程序)。它可以用来测试静态和动态资源的性能,例如:静态文件,Java Servlet,CGI Scripts,Java Object,数据库和FTP服务器…...
OpenCV CUDA 模块特征检测与描述------在GPU上执行特征描述符匹配的类cv::cuda::DescriptorMatcher
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 cv::cuda::DescriptorMatcher 是 OpenCV 的 CUDA 模块中用于在 GPU 上执行特征描述符匹配的类。它允许你利用 NVIDIA GPU 的并行计算能力来加速特…...
idea如何让文件夹分层显示,而不是圆点分割
网上说是点击小齿轮的都是过时了,对于新版idea不适用,直接上图 1、如图 2、如图 注意也是去掉Compact Middle Packages,只不过新版的方式UI和老版本的不一样了...
5:OpenCV—直方图均衡化
直方图均衡 直方图均衡是一种用于增强和调整图像对比度的图像处理技术。它通过重新分配图像的像素值,使得图像的灰度级在整个范围内均匀分布,从而增强图像的视觉效果。 图像的直方图是像素强度分布的图形表示。它提供了像素值集中位置以及是否存在异常偏…...
内存分页法
现在有个场景,页面需要分页处理,但是后端在查询完数据库后又会进行筛选,就会导致后端的查询数目跟请求的每页条数是不一样。 解决方案:内存分页法 在内存筛选后手动实现分页逻辑,保证返回数量与请求的 pageSize 一致…...
深入解析FramePack:高效视频帧打包技术原理与实践
摘要 本文深入探讨FramePack技术在视频处理领域的核心原理,解析其在不同场景下的应用优势,并通过OpenCV代码示例演示具体实现方法,为开发者提供可落地的技术解决方案。 目录 1. FramePack技术背景 2. 核心工作原理剖析 3. 典型应用场景 …...
【EI会议火热征稿中】第二届云计算与大数据国际学术会议(ICCBD 2025)
# ACM独立出版 | EI检索稳定、往届会后4个半月完成EI检索 # 热门征稿主题:大数据、5G/6G、物联网、云计算 # 早投稿早送审早录用! 重要信息 大会官网:www.iccbd.net 会议主页:【ACM独立出版|EI稳定】第二届云计算与大数据国际…...
对未来软件的看法
有了大模型之后,TypeScript这样增强型javascript语言可能更方便AI来调试。未来的应用会越来越广泛。node.js vue.js会越来越流行。因为方便AI调试,处理错误。 未来,随着 AI 编程工具对 TypeScript 的深度支持(如自动类型推导、错误…...
新兴技术与安全挑战
7.1 云原生安全(K8s安全、Serverless防护) 核心风险与攻击面 Kubernetes配置错误: 风险:默认开放Dashboard未授权访问(如kubectl proxy未鉴权)。防御:启用RBAC,限制ServiceAccount权限。Serverless函数注入: 漏洞代码(AWS Lambda):def lambda_handler(event, cont…...
Prompt Tuning:轻量级大模型微调全攻略
Prompt Tuning(提示调优)步骤金额流程 传统的 Prompt Tuning(提示调优) 是一种轻量级的大模型微调技术,核心是通过优化连续的提示向量(而非模型参数)来适配特定任务。 一、核心步骤概述 准备任务与数据 明确任务类型(如分类、问答等),准备输入文本和目标标签。加载…...
centos7安装mysql8.0
yum install -y mysql-community-server --nogpgcheckcentos7.9安装mysql8.0 在 CentOS 7.9 上安装 MySQL 8.0,你可以通过多种方式实现,但最推荐的方法是使用 MySQL 官方提供的 yum 仓库。这样可以确保安装的 MySQL 版本是最新的,并且易于管理…...
ZooKeeper 原理解析及优劣比较
大家好,这里是架构资源栈!点击上方关注,添加“星标”,一起学习大厂前沿架构! 引言 在分布式系统中,服务注册、配置管理、分布式锁、选举等场景都需要一个高可用、一致性强的协调服务。Apache ZooKeeper 凭…...
OD 算法题 B卷 【需要打开多少监视器】
文章目录 需要打开多少监视器 需要打开多少监视器 某长方形停车场,每个车位上方都有对应监控器,在当前车位和前后左右四个方向任意一个车位范围停车时,监控器才需要打开。给出某一时刻停车场的停车分布,统计最少需要打开多少个监…...
鸿蒙路由参数传递
页面test.ets 代码如下: import router from ohos.router Entry Component struct Test {State message: string Hello WorldState username: string huState password: string 1build() {Row() {Column() {Text(this.message).fontSize(50).fontWeight(FontWe…...
课程与考核
6.1 课程讲解与实战考核 6.1.1 SQL注入篇考核 考核目标:通过手动注入与工具结合,获取目标数据库敏感信息。 题目示例: 目标URL:http://vuln-site.com/product?id1 要求: 判断注入类型(联合查询/报错注…...
CNN、RNN、Transformer对于长距离依赖的捕捉能力分析
卷积网络CNN主要依靠深度来捕捉长距离依赖。但这个过程太间接了,因为信息在网络中实际传播了太多层。究竟哪些信息被保留,哪些被丢弃了,弄不清楚。从实践经验来看,卷积网络捕捉长依赖的能力非常弱。这也是为什么在大多数需要长依赖…...
封装POD与PinMap文件总结学习-20250516
基本概念 芯片封装外形图(POD,Package Outline Drawing),详细描述了芯片的物理尺寸、引脚布局和封装类型等信息; Pin Map是芯片封装的一个重要概念。它是一张详细描述芯片封装外形上各个引脚(Pinÿ…...
Qt项目开发中所遇
讲述下面代码所表示的含义: QWidget widget_19 new QWidget(); QVBoxLayout *touchAreaLayout new QVBoxLayout(widget_19);QWidget *buttonArea new QWidget(widget_19); 1、新建一个名为widget_19的QWidget,将给其应用垂直管路布局。 2、新建一个…...
ubuntu chrome无法使用搜狗拼音输入法,无法输入中文
安装好搜狗输入法后用了很久,突然有一天点击chrome自动升级后就没法用了,在别的软件都能用,还以为是配置问题,就在网上搜了好一阵子才找到解决方案,各种找问题,最后发现是需要安装fcitx5-frontend-gtk4&…...
数据结构与算法分析实验14 实现基本排序算法
实现基本排序算法 1. 常用的排序算法简介2. 上机要求3. 上机环境4.程序清单(写明运行结果及结果分析)4.1 程序清单4.1.1 头文件 sort.h 内容如下:4.1.2 实现文件 sort.cpp 内容如下:4.1.3 源文件 main.cpp 内容如下: 4.2 实现展效果示 5.上机…...
uni-app 中使用 mumu模拟器 进行调试和运行详细教程
一、下载mumu模拟器 二、复制安装路径暴保留 在文件夹中打开 三、配置全局adb命令 adb为Android Debug Bridge,就是起到调试桥的作用 打开shell文件夹、里面有一个adb.exe 将当前文件夹地址复制一下,即‘D:\Program Files\Netease\MuMu Player 12\sh…...
Visual Studio Code 改成中文模式(汉化)
1、打开工具软件(双击打开) 2、软件左边图标点开 3、在搜索框,搜索 chinese 出现的第一个 就是简体中文 4、点击第一个简体中文,右边会出来基本信息 点击 install 就可以安装了(记得联网)。 5、安装完右…...
破解 PCB 制造四大痛点:MOM 系统构建智能工厂新范式
在全球电子信息产业加速向智能化、高端化转型的背景下,PCB(印制电路板)作为 "电子产品之母",既是支撑 5G 通信、新能源汽车、人工智能等战略新兴产业发展的核心基础部件,也面临着 "多品种小批量快速切换…...
【基于深度学习的非线性光纤单像素超高速成像】
基于深度学习的非线性光纤单像素超高速成像是一种结合深度学习技术和单像素成像方法的前沿技术,旨在实现高速、高分辨率的成像。以下是一些关键点和方法: 深度学习在单像素成像中的应用 深度学习技术可以通过训练神经网络来优化单像素成像的重建过程。…...
Backend - Oracle SQL
目录 一、CRUD 增删改查(基础) (一)查询 (二)插入 (三)更新 (四)清空 二、常用 SQL 1. exists 搭配 select 1 2. FROM DUAL 3. INSTR()函数 4. 提取…...
WebSocket心跳机制
通常,心跳机制包括: 定期发送消息(如ping)到服务器以保持连接活跃检测服务器的相应(pong)如果一段时间没有收到相应,可能需要重新连接 ::: warning 在连接关闭或者发生错误时,清除心跳定时器,避免内存泄漏 ::: 在实现…...
计算机视觉与深度学习 | PSO-MVMD粒子群算法优化多元变分模态分解(Matlab完整代码和数据)
以下是一个基于PSO优化多元变分模态分解(MVMD)的Matlab示例代码框架,包含模拟数据生成和分解结果可视化。用户可根据实际需求调整参数。 %% 主程序:PSO优化MVMD参数 clc; clear; close all;% 生成模拟多变量信号 fs = 1000; % 采样频率 t = 0:1/fs:...
Fast Video Cutter Joiner v6.8.2 视频剪切合并器汉化版
想要快速拆解冗长视频,或是将零散片段拼接成完整作品?Fast Video Cutter Joiner 正是你需要的宝藏视频编辑软件!它以强大功能为核心,将复杂的视频处理变得简单直观。 精准的切割与合并功能,让你能随心所欲地裁剪视频…...
【漫话机器学习系列】269.K-Means聚类算法(K-Means Clustering)
一、K-Means 聚类算法简介 K-Means 是一种基于距离的无监督机器学习算法,属于聚类算法(Clustering Algorithm)。它的目标是将数据集划分为 K 个不重叠的子集(簇),使得每个子集中的数据点尽可能相似&#x…...
【北邮通信系统建模与仿真simulink笔记】(1)主要用到的模块库介绍
【声明】 本博客仅用于记录博主学习内容、分享笔记经验,不得用作其他非学术、非正规用途,不得商用。本声明对本博客永久生效,若违反声明所导致的一切后果,本博客均不负责。 目录 1、信号源模块库(Sources)…...
【信息系统项目管理师】第11章:项目成本管理 - 32个经典题目及详解
更多内容请见: 备考信息系统项目管理师-专栏介绍和目录 文章目录 【第1题】【第2题】【第3题】【第4题】【第5题】【第6题】【第7题】【第8题】【第9题】【第10题】【第11题】【第12题】【第13题】【第14题】【第15题】【第16题】【第17题】【第18题】【第19题】【第20题】【第…...
Java转Go日记(四十四):Sql构建
1.1.1. 执行原生SQL db.Exec("DROP TABLE users;")db.Exec("UPDATE orders SET shipped_at? WHERE id IN (?)", time.Now, []int64{11,22,33})// Scantype Result struct {Name stringAge int}var result Resultdb.Raw("SELECT name, age FROM use…...
数组day2
209长度最小的子数组 class Solution { public:int minSubArrayLen(int s, vector<int>& nums) {int result INT32_MAX;int sum 0; // 滑动窗口数值之和int i 0; // 滑动窗口起始位置int subLength 0; // 滑动窗口的长度for (int j 0; j < nums.size(); j) …...