ArkTS编程规范
文章目录
- 目标和适用范围
- 规则来源
- 章节概览
- 代码风格
- 编程实践
- 术语和定义
- 总体原则
- 命名
- 类名、枚举名、命名空间名采用UpperCamelCase风格
- 变量名、方法名、参数名采用lowerCamelCase风格
- 常量名、枚举值名采用全部大写,单词间使用下划线隔开
- 避免使用否定的布尔变量名,布尔型的局部变量或方法需加上表达是非意义的前缀
- 格式
- 使用空格缩进,禁止使用tab字符
- 行宽不超过120个字符
- 条件语句和循环语句的实现必须使用大括号
- switch语句的case和default需缩进一层
- 表达式换行需保持一致性,运算符放行末
- 多个变量定义和赋值语句不允许写在一行
- 空格应该突出关键字和重要信息,避免不必要的空格
- 建议字符串使用单引号
- 对象字面量属性超过4个,需要都换行
- 把else/catch放在if/try代码块关闭括号的同一行
- 大括号{和语句在同一行
- 编程实践
- 建议添加类属性的可访问修饰符
- 不建议省略浮点数小数点前后的0
- 判断变量是否为Number.NaN时必须使用Number.isNaN()方法
- 数组遍历优先使用Array对象方法
- 不要在控制性条件表达式中执行赋值操作
- 在finally代码块中,不要使用return、break、continue或抛出异常,避免finally块非正常结束
- 避免使用ESObject
- 使用T[]表示数组类型


目标和适用范围
本文参考业界标准及实践,结合ArkTS语言特点,为提高代码的规范、安全、性能提供编码指南。
本文适用于开发者进行系统开发或者应用开发时,使用ArkTS编写代码的场景。
规则来源
ArkTS在保持TypeScript基本语法风格的基础上,进一步强化静态检查和分析。本文部分规则筛选自《OpenHarmony应用TS&JS编程指南》,为ArkTS语言新增的语法添加了规则,旨在提高代码可读性、执行性能。
章节概览
代码风格
包含命名和格式。
编程实践
包含声明与初始化、数据类型、运算与表达式、异常等。
参考了《OpenHarmony应用TS&JS编程指南》中的规则,对其中ArkTS语言不涉及的部分作了去除,为ArkTS语言新增的语法添加了规则。
术语和定义
| 术语 | 缩略语 | 中文解释 |
|---|---|---|
| ArkTS | 无 | ArkTS编程语言 |
| TypeScript | TS | TypeScript编程语言 |
| JavaScript | JS | JavaScript编程语言 |
| ESObject | 无 | 在ArkTS跨语言调用的场景中,用以标注JS/TS对象的类型 |
总体原则
规则分为两个级别:要求、建议。
要求:表示原则上应该遵从。本文所有内容目前均为针对ArkTS的要求。
建议:表示该条款属于最佳实践,可结合实际情况考虑是否纳入。
命名
为标识符取一个好名字,提高代码可读性
【描述】
好的标识符命名,应遵循以下基本原则:
- 能清晰的表达意图,避免使用单个字母、未成惯例的缩写来命名
- 使用正确的英文单词并符合英文语法,不要使用中文拼音
- 能区分出意思,避免造成误导
类名、枚举名、命名空间名采用UpperCamelCase风格
【级别】建议
【描述】
类采用首字母大写的驼峰命名法。
类名通常是名词或名词短语,例如Person、Student、Worker。不应使用动词,也应该避免类似Data、Info这样的模糊词。
【正例】
// 类名
class User {username: stringconstructor(username: string) {this.username = username;}sayHi() {console.log('hi' + this.username);}
}// 枚举名
enum UserType {TEACHER = 0,STUDENT = 1
};// 命名空间
namespace Base64Utils {function encrypt() {// todo encrypt}function decrypt() {// todo decrypt}
};
变量名、方法名、参数名采用lowerCamelCase风格
【级别】建议
【描述】
函数的命名通常是动词或动词短语,采用小驼峰命名,示例如下:
- load + 属性名()
- put + 属性名()
- is + 布尔属性名()
- has + 名词/形容词()
- 动词()
- 动词 + 宾语()
变量的名字通常是名词或名词短语,应采用小驼峰命名,以便于理解其含义。
【正例】
let msg = 'Hello world';function sendMsg(msg: string) {// todo send message
}let userName = 'Zhangsan';function findUser(userName: string) {// todo find user by user name
}
常量名、枚举值名采用全部大写,单词间使用下划线隔开
【级别】建议
【描述】
常量命名,应该由全大写单词与下划线组成,单词间用下划线分割。常量命名要尽量表达完整的语义。
【正例】
const MAX_USER_SIZE = 10000;enum UserType {TEACHER = 0,STUDENT = 1
};
避免使用否定的布尔变量名,布尔型的局部变量或方法需加上表达是非意义的前缀
【级别】建议
【描述】
布尔型的局部变量建议加上表达是非意义的前缀,比如is,也可以是has、can、should等。但是,当使用逻辑非运算符,并出现双重否定时,会出现理解问题,比如!isNotError,意味着什么,不是很好理解。因此,应避免定义否定的布尔变量名。
【反例】
let isNoError = true;
let isNotFound = false;function empty() {}
function next() {}
【正例】
let isError = false;
let isFound = true;function isEmpty() {}
function hasNext() {}
格式
使用空格缩进,禁止使用tab字符
【级别】建议
【描述】
只允许使用空格(space)进行缩进。
建议大部分场景优先使用2个空格,换行导致的缩进优先使用4个空格。
不允许插入制表符Tab。当前几乎所有的集成开发环境(IDE)和代码编辑器都支持配置将Tab键自动扩展为2个空格输入,应在代码编辑器中配置使用空格进行缩进。
【正例】
class DataSource {id: number = 0title: string = ''content: string = ''
}const dataSource: DataSource[] = [{id: 1,title: 'Title 1',content: 'Content 1'},{id: 2,title: 'Title 2',content: 'Content 2'}];function test(dataSource: DataSource[]) {if (!dataSource.length) {return;}for (let data of dataSource) {if (!data || !data.id || !data.title || !data.content) {continue;}// some code}// some code
}
行宽不超过120个字符
【级别】建议
【描述】
代码行宽不宜过长,否则不利于阅读。
控制行宽可以间接的引导程序员去缩短函数、变量的命名,减少嵌套的层数,精炼注释,提升代码可读性。
建议每行字符数不要超过120个;除非超过120能显著增加可读性,并且不会隐藏信息。
例外:如果一行注释包含了超过120个字符的命令或URL,则可以保持一行,以方便复制、粘贴和通过grep查找;预处理的error信息在一行便于阅读和理解,即使超过120个字符。
条件语句和循环语句的实现必须使用大括号
【级别】建议
【描述】
在if、for、do、while等语句的执行体加大括号{}是一种最佳实践,因为省略大括号容易导致错误,并且降低代码的清晰度。
【反例】
if (condition)console.log('success');for (let idx = 0; idx < 5; ++idx)console.log(idx);
【正例】
if (condition) {console.log('success');
}for (let idx = 0; idx < 5; ++idx) {console.log(idx);
}
switch语句的case和default需缩进一层
【级别】建议
【描述】
switch的case和default要缩进一层(2个空格)。开关标签之后换行的语句,需再缩进一层(2个空格)。
【正例】
switch (condition) {case 0: {doSomething();break;}case 1: {doOtherthing();break;}default:break;
}
表达式换行需保持一致性,运算符放行末
【级别】建议
【描述】
当语句过长,或者可读性不佳时,需要在合适的地方换行。
换行时将操作符放在行末,表示“未结束,后续还有”,保持与常用的格式化工具的默认配置一致。
【正例】
// 假设条件语句超出行宽
if (userCount > MAX_USER_COUNT ||userCount < MIN_USER_COUNT) {doSomething();
}
多个变量定义和赋值语句不允许写在一行
【级别】要求
【描述】
每个语句的变量声明都应只声明一个变量。
这种方式更易添加变量声明,不用考虑将;变成,,以免引入错误。另外,每个语句只声明一个变量,用debugger逐个调试也很方便,而不是一次跳过所有变量。
【反例】
let maxCount = 10, isCompleted = false;
let pointX, pointY;
pointX = 10; pointY = 0;
【正例】
let maxCount = 10;
let isCompleted = false;
let pointX = 0;
let pointY = 0;
空格应该突出关键字和重要信息,避免不必要的空格
【级别】建议
【描述】
空格应该突出关键字和重要信息。总体建议如下:
- if, for, while, switch等关键字与左括号(之间加空格。
- 在函数定义和调用时,函数名称与参数列表的左括号(之间不加空格。
- 关键字else或catch与其之前的大括号}之间加空格。
- 任何打开大括号({)之前加空格,有两个例外:
a) 在作为函数的第一个参数或数组中的第一个元素时,对象之前不用加空格,例如:foo({ name: ‘abc’ })。
b) 在模板中,不用加空格,例如:abc${name}。 - 二元操作符(+ - * = < > <= >= === !== && ||)前后加空格;三元操作符(? :)符号两侧均加空格。
- 数组初始化中的逗号和函数中多个参数之间的逗号后加空格。
- 在逗号(,)或分号(;)之前不加空格。
- 数组的中括号([])内侧不要加空格。
- 不要出现多个连续空格。在某行中,多个空格若不是用来作缩进的,通常是个错误。
【反例】
// if 和左括号 ( 之间没有加空格
if(isJedi) {fight();
}// 函数名fight和左括号 ( 之间加了空格
function fight (): void {console.log('Swooosh!');
}
【正例】
// if 和左括号之间加一个空格
if (isJedi) {fight();
}// 函数名fight和左括号 ( 之间不加空格
function fight(): void {console.log('Swooosh!');
}
【反例】
if (flag) {//...
}else { // else 与其前面的大括号 } 之间没有加空格//...
}
【正例】
if (flag) {//...
} else { // else 与其前面的大括号 } 之间增加空格//...
}
【正例】
function foo() { // 函数声明时,左大括号 { 之前加个空格//...
}bar('attr', { // 左大括号前加个空格age: '1 year',sbreed: 'Bernese Mountain Dog',
});
【正例】
const arr = [1, 2, 3]; // 数组初始化中的逗号后面加个空格,逗号前面不加空格
myFunc(bar, foo, baz); // 函数的多个参数之间的逗号后加个空格,逗号前面不加空格
建议字符串使用单引号
【级别】建议
【描述】
较为约定俗成,单引号优于双引号。
【反例】
let message = "world";
console.log(message);
【正例】
let message = 'world';
console.log(message);
对象字面量属性超过4个,需要都换行
【级别】建议
【描述】
对象字面量要么每个属性都换行,要么所有属性都在同一行。当对象字面量属性超过4个的时候,建议统一换行。
【反例】
interface I {name: stringage: numbervalue: numbersum: numberfoo: booleanbar: boolean
}let obj: I = { name: 'tom', age: 16, value: 1, sum: 2, foo: true, bar: false }
【正例】
interface I {name: stringage: numbervalue: numbersum: numberfoo: booleanbar: boolean
}let obj: I = {name: 'tom',age: 16,value: 1,sum: 2,foo: true,bar: false
}
把else/catch放在if/try代码块关闭括号的同一行
【级别】建议
【描述】
在写条件语句时,建议把else放在if代码块关闭括号的同一行。同样,在写异常处理语句时,建议把catch也放在try代码块关闭括号的同一行。
【反例】
if (isOk) {doThing1();doThing2();
}
else {doThing3();
}
【正例】
if (isOk) {doThing1();doThing2();
} else {doThing3();
}
【反例】
try {doSomething();
}
catch (err) {// 处理错误
}
【正例】
try {doSomething();
} catch (err) {// 处理错误
}
大括号{和语句在同一行
【级别】建议
【描述】
应保持一致的大括号风格。建议将大括号放在控制语句或声明语句同一行的位置。
【反例】
function foo()
{//...
}
【正例】
function foo() {//...
}
编程实践
建议添加类属性的可访问修饰符
【级别】建议
【描述】
在ArkTS中,提供了private, protected和public可访问修饰符。默认情况下一个属性的可访问修饰符为public。选取适当的可访问修饰符可以提升代码的安全性、可读性。注意:如果类中包含private属性,无法通过对象字面量初始化该类。
【反例】
class C {count: number = 0getCount(): number {return this.count}
}
【正例】
class C {private count: number = 0public getCount(): number {return this.count}
}
不建议省略浮点数小数点前后的0
【级别】建议
【描述】
在ArkTS中,浮点值会包含一个小数点,没有要求小数点之前或之后必须有一个数字。在小数点前面和后面均添加数字可以提高代码可读性。
【反例】
const num = .5;
const num = 2.;
const num = -.7;
【正例】
const num = 0.5;
const num = 2.0;
const num = -0.7;
判断变量是否为Number.NaN时必须使用Number.isNaN()方法
【级别】要求
【描述】
在ArkTS中,Number.NaN是Number类型的一个特殊值。它被用来表示非数值,这里的数值是指在IEEE浮点数算术标准中定义的双精度64位格式的值。
因为在ArkTS中Number.NaN独特之处在于它不等于任何值,包括它本身,与Number.NaN进行比较的结果是令人困惑:Number.NaN !== Number.NaN or Number.NaN != Number.NaN的值都是true。
因此,必须使用Number.isNaN()函数来测试一个值是否是Number.NaN。
【反例】
if (foo == Number.NaN) {// ...
}if (foo != Number.NaN) {// ...
}
【正例】
if (Number.isNaN(foo)) {// ...
}if (!Number.isNaN(foo)) {// ...
}
数组遍历优先使用Array对象方法
【级别】要求
【描述】
对于数组的遍历处理,应该优先使用Array对象方法,如:forEach(), map(), every(), filter(), find(), findIndex(), reduce(), some()。
【反例】
const numbers = [1, 2, 3, 4, 5];
// 依赖已有数组来创建新的数组时,通过for遍历,生成一个新数组
const increasedByOne: number[] = [];
for (let i = 0; i < numbers.length; i++) {increasedByOne.push(numbers[i] + 1);
}
【正例】
const numbers = [1, 2, 3, 4, 5];
// better: 使用map方法是更好的方式
const increasedByOne: number[] = numbers.map(num => num + 1);
不要在控制性条件表达式中执行赋值操作
【级别】要求
【描述】
控制性条件表达式常用于if、while、for、?:等条件判断中。
在控制性条件表达式中执行赋值,常常导致意料之外的行为,且代码的可读性非常差。
【反例】
// 在控制性判断中赋值不易理解
if (isFoo = false) {...
}
【正例】
const isFoo = someBoolean; // 在上面赋值,if条件判断中直接使用
if (isFoo) {...
}
在finally代码块中,不要使用return、break、continue或抛出异常,避免finally块非正常结束
【级别】要求
【描述】
在finally代码块中,直接使用return、break、continue、throw语句,或由于调用方法的异常未处理,会导致finally代码块无法正常结束。非正常结束的finally代码块会影响try或catch代码块中异常的抛出,也可能会影响方法的返回值。所以要保证finally代码块正常结束。
【反例】
function foo() {try {...return 1;} catch (err) {...return 2;} finally {return 3;}
}
【正例】
function foo() {try {...return 1;} catch (err) {...return 2;} finally {console.log('XXX!');}
}
避免使用ESObject
【级别】建议
【描述】
ESObject主要用在ArkTS和TS/JS跨语言调用场景中的类型标注,在非跨语言调用场景中使用ESObject标注类型,会引入不必要的跨语言调用,造成额外性能开销。
【反例】
// lib.ets
export interface I {sum: number
}export function getObject(value: number): I {let obj: I = { sum: value };return obj
}// app.ets
import { getObject } from 'lib'
let obj: ESObject = getObject(123);
【正例】
// lib.ets
export interface I {sum: number
}export function getObject(value: number): I {let obj: I = { sum: value };return obj
}// app.ets
import { getObject, I } from 'lib'
let obj: I = getObject(123);
使用T[]表示数组类型
【级别】建议
【描述】
ArkTS提供了两种数组类型的表示方式:T[]和Array。为了代码的可读性,建议所有数组类型均用T[]来表示。
【反例】
let x: Array<number> = [1, 2, 3];
let y: Array<string> = ['a', 'b', 'c'];
【正例】
// 统一使用T[]语法
let x: number[] = [1, 2, 3];
let y: string[] = ['a', 'b', 'c'];

相关文章:
ArkTS编程规范
文章目录 目标和适用范围规则来源章节概览代码风格编程实践 术语和定义总体原则命名类名、枚举名、命名空间名采用UpperCamelCase风格变量名、方法名、参数名采用lowerCamelCase风格常量名、枚举值名采用全部大写,单词间使用下划线隔开避免使用否定的布尔变量名&…...
SQL进阶实战技巧:断点去重技术详解
目录 一、核心概念 二、典型应用场景 三、实现步骤与SQL示例 场景 目标 步骤 分析 结果 四、核心原理解释 1. 核心原理:相邻比较 2. 去重的本质 3. 与传统方法的对比 4 类别理解 五、如何应对复杂场景? 1. 多字段断点检测 2. 时间窗口断点 …...
深度学习之“向量范数和距离度量”
在深度学习中,范数和向量距离是两个不同的概念。向量范数是一种函数,用于将一个实数或复数向量映射为一个值。虽然范数通常用于度量向量之间的距离,但是同样也有其它的一些表示距离的方式。 范数距离 范数是具有“长度”概念的函数。在向量…...
基于Python的简单企业维修管理系统的设计与实现
以下是一个基于Python的简单企业维修管理系统的设计与实现,这里我们会使用Flask作为Web框架,SQLite作为数据库来存储相关信息。 1. 需求分析 企业维修管理系统主要功能包括: 维修工单的创建、查询、更新和删除。设备信息的管理。维修人员…...
javascript常用函数大全
javascript函数一共可分为五类: •常规函数 •数组函数 •日期函数 •数学函数 •字符串函数 1.常规函数 javascript常规函数包括以下9个函数: (1)alert函数:显示一个警告对话框,包括一个OK按钮。 (2)confirm函数:显…...
【Leetcode 每日一题】81. 搜索旋转排序数组 II
问题背景 已知存在一个按非降序排列的整数数组 n u m s nums nums,数组中的值不必互不相同。 在传递给函数之前, n u m s nums nums 在预先未知的某个下标 k ( 0 < k < n u m s . l e n g t h ) k\ (0 < k < nums.length) k (0<k<…...
< OS 有关 > Android 手机 SSH 客户端 app: connectBot
connectBot 开源且功能齐全的SSH客户端,界面简洁,支持证书密钥。 下载量超 500万 方便在 Android 手机上,连接 SSH 服务器,去运行命令。 Fail2ban 12小时内抓获的 IP ~ ~ ~ ~ rootjpn:~# sudo fail2ban-client status sshd Status for the jail: sshd …...
【算法设计与分析】实验7:复杂装载及0/1背包问题的回溯法设计与求解
目录 一、实验目的 二、实验环境 三、实验内容 四、核心代码 五、记录与处理 六、思考与总结 七、完整报告和成果文件提取链接 一、实验目的 针对复杂装载问题、及0/1背包问题开展分析、建模、评价,算法设计与优化,并进行编码实践。 理解复杂装载…...
仿真设计|基于51单片机的温湿度、一氧化碳、甲醛检测报警系统
目录 具体实现功能 设计介绍 51单片机简介 资料内容 仿真实现(protues8.7) 程序(Keil5) 全部内容 资料获取 具体实现功能 (1)温湿度传感器、CO传感器、甲醛传感器实时检测温湿度值、CO值和甲醛值进…...
使用vhd虚拟磁盘安装两个win10系统
使用vhd虚拟磁盘安装两个win10系统 前言vhd虚拟磁盘技术简介准备工具开始动手实践1.winX选择磁盘管理2.选择“操作”--“创建VHD”3.自定义一个位置,输入虚拟磁盘大小4.右键初始化磁盘5.选择GPT分区表格式6.右键新建简单卷7.给卷起个名字,用于区分8.打开…...
Python学习——函数参数详解
Python中的函数参数传递机制允许多种灵活的参数类型,可以根据需求灵活配置参数,这使得函数具有更强大的扩展性和适应性。以下是对各类参数类型的详细说明: 1. 定义函数的不同参数类型 1.1 位置参数 定义方式:def func(a, b2) 特…...
深入理解Spring事务管理
一、事务基础概念 1.1 什么是事务? 事务(Transaction)是数据库操作的最小工作单元,具有ACID四大特性: 原子性(Atomicity):事务中的操作要么全部成功,要么全部失败 一致…...
自制虚拟机(C/C++)(二、分析引导扇区,虚拟机读二进制文件img软盘)
先修复上一次的bug,添加新指令,并增加图形界面 #include <graphics.h> #include <conio.h> #include <windows.h> #include <commdlg.h> #include <iostream> #include <fstream> #include <sstream> #inclu…...
基于最近邻数据进行分类
人工智能例子汇总:AI常见的算法和例子-CSDN博客 完整代码: import torch import numpy as np from sklearn.neighbors import KNeighborsClassifier from sklearn.metrics import accuracy_score import matplotlib.pyplot as plt# 生成一个简单的数据集 (2个特征和2个分类…...
ASP.NET Core 启动并提供静态文件
ASP.NET Core 启动并提供静态文件 即是单个可执行文件,它既运行 API 项目,也托管 前端项目(通常是前端的发布文件)。 这种方式一般是通过将 前端项目 的发布文件(例如 HTML、CSS、JavaScript)放入 Web AP…...
【异步编程】CompletableFuture:异步任务的选择(执行最快的)执行
文章目录 一. applyToEither : 拿到第一个任务结束的结果二. runAfterEither :第一个任务完成后执行副作用三. acceptEither:消费第一个任务的结果四. 三种接口总结 对于两个异步任务,我们有时希望在其中一个任务完成时立即执行某些操作&…...
4 [危机13小时追踪一场GitHub投毒事件]
事件概要 自北京时间 2024.12.4 晚间6点起, GitHub 上不断出现“幽灵仓库”,仓库中没有任何代码,只有诱导性的病毒文件。当天,他们成为了 GitHub 上 star 增速最快的仓库。超过 180 个虚假僵尸账户正在传播病毒,等待不…...
变量和常量
一.变量 1.标准声明 var 变量名 变量类型 变量声明行末不需要分号 2..批量声明 package main import "fmt" func main(){var(a string b int c boold float32)}3.变量的初始化 var a int 10 var b float321.1 4.类型推导 var name"tom" var age18 fmt.Pr…...
大模型概述(方便不懂技术的人入门)
1 大模型的价值 LLM模型对人类的作用,就是一个百科全书级的助手。有多么地百科全书,则用参数的量来描述, 一般地,大模型的参数越多,则该模型越好。例如,GPT-3有1750亿个参数,GPT-4可能有超过1万…...
流浪 Linux: 外置 USB SSD 安装 ArchLinux
注: ArchLinux 系统为滚动更新, 变化很快, 所以本文中的安装方法可能很快就过时了, 仅供参考. 实际安装时建议去阅读官方文档. 最近, 突然 (也没有那么突然) 有了一大堆 PC: 4 个笔记本, 2 个台式主机 (M-ATX 主板), 1 个小主机 (迷你主机). 嗯, 多到用不过来. 但是, 窝又不能…...
Hot100之子串
560和为K的子数组 题目 给你一个整数数组 nums 和一个整数 k ,请你统计并返回 该数组中和为 k 的子数组的个数 。 子数组是数组中元素的连续非空序列 思路解析 ps:我们的presum【0】就是0,如果没有这个0的话我们的第一个元素就无法减去上…...
网络工程师 (11)软件生命周期与开发模型
一、软件生命周期 前言 软件生命周期,也称为软件开发周期或软件开发生命周期,是指从软件项目的启动到软件不再被使用为止的整个期间。这个过程可以细分为多个阶段,每个阶段都有其特定的目标、任务和产出物。 1. 问题定义与需求分析 问题定义…...
(三)QT——信号与槽机制——计数器程序
目录 前言 信号(Signal)与槽(Slot)的定义 一、系统自带的信号和槽 二、自定义信号和槽 三、信号和槽的扩展 四、Lambda 表达式 总结 前言 信号与槽机制是 Qt 中的一种重要的通信机制,用于不同对象之间的事件响…...
从0开始使用面对对象C语言搭建一个基于OLED的图形显示框架(基础图形库实现)
目录 基础图形库的抽象 抽象图形 抽象点 设计我们的抽象 实现我们的抽象 测试 抽象线 设计我们的抽象 实现我们的抽象 绘制垂直的和水平的线 使用Bresenham算法完成任意斜率的绘制 绘制三角形和矩形 矩形 三角形 实现 绘制圆,圆弧和椭圆 继续我们的…...
hot100_21. 合并两个有序链表
将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例 1: 输入:l1 [1,2,4], l2 [1,3,4] 输出:[1,1,2,3,4,4] 示例 2: 输入:l1 [], l2 [] 输出:[…...
安全防护前置
就业概述 网络安全工程师/安全运维工程师/安全工程师 安全架构师/安全专员/研究院(数学要好) 厂商工程师(售前/售后) 系统集成工程师(所有计算机知识都要会一点) 学习目标 前言 网络安全事件 蠕虫病毒--&…...
01-六自由度串联机械臂(ABB)位置分析
ABB工业机器人(IRB2600)如下图所示(d1444.8mm,a1150mm,a2700mm,a3115mm,d4795mm,d685mm),利用改进DH法建模,坐标系如下所示: 利用改进…...
JVM运行时数据区域-附面试题
Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域。这些区域 有各自的用途,以及创建和销毁的时间,有的区域随着虚拟机进程的启动而一直存在,有些区域则是 依赖用户线程的启动和结束而建立和销毁。 1. 程序计…...
Java线程池与Future_优化并发任务执行
1. 引言 1.1 并发编程的重要性 并发编程是现代软件开发中的关键部分,特别是在处理高并发、大数据和分布式系统时。通过并发编程,可以充分利用多核处理器的计算能力,提高系统的吞吐量和响应速度。 1.2 线程池与Future的作用 线程池:提供了对线程资源的有效管理和复用,减…...
HTML(快速入门)
欢迎大家来到我的博客~欢迎大家对我的博客提出指导,有错误的地方会改进的哦~点击这里了解更多内容 目录 一、前言二、HTML基础2.1 什么是HTML?2.2 认识HTML标签2.2.1 HTML标签当中的基本结构2.2.2 标签层次结构 2.3 HTML常见标签2.3.1 标题标签2.3.2 段落标签2.3.3…...
