HarmonyOS 应用开发之线性容器

线性容器实现能按顺序访问的数据结构,其底层主要通过数组实现,包括ArrayList、Vector、List、LinkedList、Deque、Queue、Stack七种。

线性容器,充分考虑了数据访问的速度,运行时(Runtime)通过一条字节码指令就可以完成增、删、改、查等操作。

ArrayList

ArrayList 即动态数组,可用来构造全局的数组对象。 当需要频繁读取集合中的元素时,推荐使用ArrayList。

ArrayList依据泛型定义,要求存储位置是一片连续的内存空间,初始容量大小为10,并支持动态扩容,每次扩容大小为原始容量的1.5倍。

ArrayList进行增、删、改、查操作的常用API如下:

操作描述
增加元素通过add(element: T)函数每次在数组尾部增加一个元素。
增加元素通过insert(element: T, index: number)在指定位置插入一个元素。
访问元素通过arr[index]获取指定index对应的value值,通过指令获取保证访问速度。
访问元素通过forEach(callbackFn: (value: T, index?: number, arrlist?: ArrayList<T>) => void, thisArg?: Object): void访问整个ArrayList容器的元素。
访问元素通过[Symbol.iterator]():IterableIterator<T>迭代器进行数据访问。
修改元素通过arr[index] = xxx修改指定index位置对应的value值。
删除元素通过remove(element: T)删除第一个匹配到的元素。
删除元素通过removeByRange(fromIndex: number, toIndex:number)删除指定范围内的元素。

Vector

说明
API version 9开始,该接口不再维护,推荐使用 ArrayList 。

Vector 是指连续存储结构,可用来构造全局的数组对象。Vector依据泛型定义,要求存储位置是一片连续的内存空间,初始容量大小为10,并支持动态扩容,每次扩容大小为原始容量的2倍。

Vector和 ArrayList 相似,都是基于数组实现,但Vector提供了更多操作数组的接口。Vector在支持操作符访问的基础上,还增加了get/set接口,提供更为完善的校验及容错机制,满足用户不同场景下的需求。

Vector进行增、删、改、查操作的常用API如下:

操作描述
增加元素通过add(element: T)函数每次在数组尾部增加一个元素。
增加元素通过insert(element: T, index: number)在指定位置插入一个元素。
访问元素通过vec[index]获取指定index对应的value值,通过指令获取保证访问速度。
访问元素通过get(index: number)获取指定index位置对应的元素。
访问元素通过getLastElement()获取最后一个元素。
访问元素通过getIndexOf(element:T)获取第一个匹配到元素的位置。
访问元素通过getLastIndexOf(element:T)获取最后一个匹配到元素的位置。
访问元素通过forEach(callbackFn: (value: T, index?: number, Vector?: Vector<T>) => void, thisArg?: Object)访问整个Vector的元素。
访问元素通过[Symbol.iterator]():IterableIterator<T>迭代器进行数据访问。
修改元素通过vec[index]=xxx修改指定index位置对应的value值。
修改元素通过set(index:number,element:T)修改指定index位置的元素值为element。
修改元素通过setLength(newSize:number)设置Vector的长度大小。
删除元素通过removeByIndex(index:number)删除index位置对应的value值。
删除元素通过remove(element:T)删除第一个匹配到的元素。
删除元素通过removeByRange(fromIndex:number,toIndex:number)删除指定范围内的元素。

List

List 可用来构造一个单向链表对象,即只能通过头结点开始访问到尾节点。List依据泛型定义,在内存中的存储位置可以是不连续的。

List和 LinkedList 相比,LinkedList是双向链表,可以快速地在头尾进行增删,而List是单向链表,无法双向操作。

当需要频繁的插入删除时,推荐使用List高效操作。

可以通过get/set等接口对存储的元素进行修改,List进行增、删、改、查操作的常用API如下:

操作描述
增加元素通过add(element: T)函数每次在数组尾部增加一个元素。
增加元素通过insert(element: T, index: number)在指定位置插入一个元素。
访问元素通过list[index]获取指定index对应的value值,通过指令获取保证访问速度。
访问元素通过get(index: number)获取指定index位置对应的元素。
访问元素通过getFirst()获取第一个元素。
访问元素通过getLast()获取最后一个元素。
访问元素通过getIndexOf(element: T)获取第一个匹配到元素的位置。
访问元素通过getLastIndexOf(element: T)获取最后一个匹配到元素的位置。
访问元素通过forEach(callbackfn: (value:T, index?: number, list?: List<T>)=> void,thisArg?: Object)访问整个List的元素。
访问元素通过[Symbol.iterator]():IterableIterator<T>迭代器进行数据访问。
修改元素通过list[index] = xxx修改指定index位置对应的value值。
修改元素通过set(index:number, element: T)修改指定index位置的元素值为element。
修改元素通过replaceAllElements(callbackFn:(value: T,index?: number,list?: List<T>)=>T,thisArg?: Object)对List内元素进行替换操作。
删除元素通过removeByIndex(index:number)删除index位置对应的value值。
删除元素通过remove(element:T)删除第一个匹配到的元素。

LinkedList

LinkedList 可用来构造一个双向链表对象,可以在某一节点向前或者向后遍历List。LinkedList依据泛型定义,在内存中的存储位置可以是不连续的。

LinkedList和 List 相比,LinkedList是双向链表,可以快速地在头尾进行增删,而List是单向链表,无法双向操作。

LinkedList和 ArrayList 相比,插入数据效率LinkedList优于ArrayList,而查询效率ArrayList优于LinkedList。

当需要频繁的插入删除时,推荐使用LinkedList高效操作。

可以通过get/set等接口对存储的元素进行修改,LinkedList进行增、删、改、查操作的常用API如下:

操作描述
增加元素通过add(element: T)函数每次在数组尾部增加一个元素。
增加元素通过insert(index: number, element: T)在指定位置插入一个元素。
访问元素通过list[index]获取指定index对应的value值,通过指令获取保证访问速度。
访问元素通过get(index: number)获取指定index位置对应的元素。
访问元素通过getFirst()获取第一个元素。
访问元素通过getLast()获取最后一个元素。
访问元素通过getIndexOf(element: T)获取第一个匹配到元素的位置。
访问元素通过getLastIndexOf(element: T)获取最后一个匹配到元素的位置。
访问元素通过forEach(callbackFn: (value: T, index?: number, list?: LinkedList<T>) => void, thisArg?: Object)访问整个LinkedList的元素。
访问元素通过[Symbol.iterator]():IterableIterator<T>迭代器进行数据访问。
修改元素通过list[index]=xxx修改指定index位置对应的value值。
修改元素通过set(index: number,element: T)修改指定index位置的元素值为element。
删除元素通过removeByIndex(index: number)删除index位置对应的value值。
删除元素通过remove(element: T)删除第一个匹配到的元素。

Deque

Deque 可用来构造双端队列对象,存储元素遵循先进先出以及先进后出的规则,双端队列可以分别从队头或者队尾进行访问。

Deque依据泛型定义,要求存储位置是一片连续的内存空间,其初始容量大小为8,并支持动态扩容,每次扩容大小为原始容量的2倍。Deque底层采用循环队列实现,入队及出队操作效率都比较高。

Deque和 Queue 相比,Queue的特点是先进先出,只能在头部删除元素,尾部增加元素。

Deque和 Vector 相比,它们都支持在两端增删元素,但Deque不能进行中间插入的操作。对头部元素的插入删除效率高于Vector,而Vector访问元素的效率高于Deque。

需要频繁在集合两端进行增删元素的操作时,推荐使用Deque。

Deque进行增、删、改、查操作的常用API如下:

操作描述
增加元素通过insertFront(element: T)函数每次在队头增加一个元素。
增加元素通过insertEnd(element: T)函数每次在队尾增加一个元素。
访问元素通过getFirst()获取队首元素的value值,但是不进行出队操作。
访问元素通过getLast()获取队尾元素的value值,但是不进行出队操作。
访问元素通过popFirst()获取队首元素的value值,并进行出队操作。
访问元素通过popLast()获取队尾元素的value值,并进行出队操作。
访问元素通过forEach(callbackFn:(value: T, index?: number, deque?: Deque<T>) => void, thisArg?: Object)访问整个Deque的元素。
访问元素通过[Symbol.iterator]():IterableIterator<T>迭代器进行数据访问。
修改元素通过forEach(callbackFn:(value: T, index?: number, deque?: Deque<T>)=> void, thisArg?: Object)对队列进行修改操作。
删除元素通过popFirst()对队首元素进行出队操作并删除。
删除元素通过popLast()对队尾元素进行出队操作并删除。

Queue

Queue 可用来构造队列对象,存储元素遵循先进先出的规则。

Queue依据泛型定义,要求存储位置是一片连续的内存空间,初始容量大小为8,并支持动态扩容,每次扩容大小为原始容量的2倍。

Queue底层采用循环队列实现,入队及出队操作效率都比较高。

Queue和 Deque 相比,Queue只能在一端删除一端增加,Deque可以两端增删。

一般符合先进先出的场景可以使用Queue。

Queue进行增、删、改、查操作的常用API如下:

操作描述
增加元素通过add(element: T)函数每次在队尾增加一个元素。
访问元素通过getFirst()获取队首元素的value值,但是不进行出队操作。
访问元素通过pop()获取队首元素的value值,并进行出队操作。
访问元素通过forEach(callbackFn: (value: T, index?: number, queue?: Queue<T>) => void,thisArg?: Object)访问整个Queue的元素。
访问元素通过[Symbol.iterator]():IterableIterator<T>迭代器进行数据访问。
修改元素通过forEach(callbackFn:(value: T, index?: number, queue?: Queue<T>) => void,thisArg?: Object)对队列进行修改操作。
删除元素通过pop()对队首进行出队操作并删除。

Stack

Stack 可用来构造栈对象,存储元素遵循先进后出的规则。

Stack依据泛型定义,要求存储位置是一片连续的内存空间,初始容量大小为8,并支持动态扩容,每次扩容大小为原始容量的1.5倍。Stack底层基于数组实现,入栈出栈均从数组的一端操作。

Stack和 Queue 相比,Queue基于循环队列实现,只能在一端删除,另一端插入,而Stack都在一端操作。

一般符合先进后出的场景可以使用Stack。

Stack进行增、删、改、查操作的常用API如下:

操作描述
增加元素通过push(item: T)函数每次在栈顶增加一个元素。
访问元素通过peek()获取栈顶元素的value值,但是不进行出栈操作。
访问元素通过pop()获取栈顶的value值,并进行出栈操作。
访问元素通过forEach(callbackFn: (value: T, index?: number, stack?: Stack<T>) => void, thisArg?: Object)访问整个Stack的元素。
访问元素通过[Symbol.iterator]():IterableIterator<T>迭代器进行数据访问。
访问元素通过locate(element: T)获取元素对应的位置。
修改元素通过forEach(callbackFn:(value: T, index?: number, stack?: Stack<T>) => void, thisArg?: Object)对栈内元素进行修改操作。
删除元素通过pop()对栈顶进行出栈操作并删除。

线性容器的使用

此处列举常用的线性容器ArrayList、Vector、Deque、Stack、List的使用示例,包括导入模块、增加元素、访问元素及修改等操作。示例代码如下所示:

// ArrayList
import ArrayList from '@ohos.util.ArrayList'; // 导入ArrayList模块let arrayList1: ArrayList<string> = new ArrayList();
arrayList1.add('a');
let arrayList2: ArrayList<number> = new ArrayList();
arrayList2.add(1); // 增加元素
console.info(`result: ${arrayList2[0]}`); // 访问元素
arrayList1[0] = 'one'; // 修改元素
console.info(`result: ${arrayList1[0]}`);// Vector
import Vector from '@ohos.util.Vector'; // 导入Vector模块let vector1: Vector<string> = new Vector();
vector1.add('a');
let vector2: Vector<Array<number>> = new Vector();
let b1 = [1, 2, 3];
vector2.add(b1);
let vector3: Vector<boolean> = new Vector();
vector3.add(false); // 增加元素
console.info(`result: ${vector1[0]}`); // 访问元素
console.info(`result: ${vector2.getFirstElement()}`); // 访问元素// Deque
import Deque from '@ohos.util.Deque'; // 导入Deque模块let deque1: Deque<string> = new Deque();
deque1.insertFront('a');
let deque2: Deque<number> = new Deque();
deque2.insertFront(1); // 增加元素
console.info(`result: ${deque1[0]}`); // 访问元素
deque1[0] = 'one'; // 修改元素
console.info(`result: ${deque2[0]}`);// Stack
import Stack from '@ohos.util.Stack'; // 导入Stack模块let stack1: Stack<string> = new Stack();
stack1.push('a');
let stack2: Stack<number> = new Stack();
stack2.push(1); // 增加元素
console.info(`result: ${stack1[0]}`); // 访问元素
stack2.pop(); // 删除栈顶元素并返回该删除元素
console.info(`result: ${stack2.length}`);// List
import List from '@ohos.util.List'; // 导入List模块let list1: List<string> = new List();
list1.add('a');
let list2: List<number> = new List();
list2.add(1);
let list3: List<Array<number>> = new List();
let b2 = [1, 2, 3];
list3.add(b2); // 增加元素
console.info(`result: ${list1[0]}`); // 访问元素
console.info(`result: ${list3.get(0)}`); // 访问元素

为了能让大家更好的学习鸿蒙(HarmonyOS NEXT)开发技术,这边特意整理了《鸿蒙开发学习手册》(共计890页),希望对大家有所帮助:https://qr21.cn/FV7h05

《鸿蒙开发学习手册》:

如何快速入门:https://qr21.cn/FV7h05

  1. 基本概念
  2. 构建第一个ArkTS应用
  3. ……

开发基础知识:https://qr21.cn/FV7h05

  1. 应用基础知识
  2. 配置文件
  3. 应用数据管理
  4. 应用安全管理
  5. 应用隐私保护
  6. 三方应用调用管控机制
  7. 资源分类与访问
  8. 学习ArkTS语言
  9. ……

基于ArkTS 开发:https://qr21.cn/FV7h05

  1. Ability开发
  2. UI开发
  3. 公共事件与通知
  4. 窗口管理
  5. 媒体
  6. 安全
  7. 网络与链接
  8. 电话服务
  9. 数据管理
  10. 后台任务(Background Task)管理
  11. 设备管理
  12. 设备使用信息统计
  13. DFX
  14. 国际化开发
  15. 折叠屏系列
  16. ……

鸿蒙开发面试真题(含参考答案):https://qr18.cn/F781PH

鸿蒙开发面试大盘集篇(共计319页):https://qr18.cn/F781PH

1.项目开发必备面试题
2.性能优化方向
3.架构方向
4.鸿蒙开发系统底层方向
5.鸿蒙音视频开发方向
6.鸿蒙车载开发方向
7.鸿蒙南向开发方向

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/293820.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Django 仿博客园练习

数据库搭建 部分功能介绍 【一】注册 &#xff08;1&#xff09;效果显示、简单简介 主要亮点 结合了layui和forms组件默认头像可以随着性别的选择发生改变自定义头像可以实时更新显示forms组件报错信息可以局部刷新显示在对应框体下面 没有直接使用layui的前端验证后端验证…

C++教学——从入门到精通 5.单精度实数float

众所周知&#xff0c;三角形的面积公式是(底*高)/2 那就来做个三角形面积计算器吧 到吗如下 #include"bits/stdc.h" using namespace std; int main(){int a,b;cin>>a>>b;cout<<(a*b)/2; } 这不对呀&#xff0c;明明是7.5而他却是7&#xff0c;…

商城业务-检索服务

文章目录 前言一、搭建页面环境1.1 静态界面搭建1.2 Nginx 动静分离1.3 Windows 上传文件1.4 引入 thymeleaf 依赖1.5 Nginx 反向代理1.4 Nginx 配置1.5 gateway 网关配置 二、调整页面跳转2.1 引入依赖2.2 页面跳转 三、检索查询参数模型分析抽取3.1 检索业务分析3.2 检索语句…

【上海大学计算机组成原理实验报告】二、数据传送实验

一、实验目的 了解在模型机中算术、逻辑运算单元的控制方法。学习机器语言程序的运行过程。通过人工译码&#xff0c;加深对译码器基本工作原理的理解。 二、实验原理 根据实验指导书的相关内容&#xff0c;本次实验所要用的CP226实验仪在手动方式下&#xff0c;运算功能通过…

记录何凯明在MIT的第一堂课:神经网络发展史

https://www.youtube.com/watch?vZ5qJ9IxSuKo 目录 表征学习 主要特点&#xff1a; 方法和技术&#xff1a; LeNet 全连接层​ 主要特点&#xff1a; 主要特点&#xff1a; 网络结构&#xff1a; AlexNet 主要特点&#xff1a; 网络结构&#xff1a; Sigmoid Re…

碳素光线疗法与宠物健康

碳素光线与宠物健康 生息在地球上的所有动物、在自然太阳光奇妙的作用下、生长发育。太阳光的能量使它们不断进化、繁衍种族。现在、生物能够生存、全仰仗于太阳的光线。太阳光线中、包含有动物健康所需要的极为重要的波长。因此、和户外饲养的动物相比、在室内喂养的观赏动物、…

全套医院手术麻醉系统源码 人工智能麻醉系统源码 医疗管理系统源码

全套医院手术麻醉系统源码 人工智能麻醉系统源码 医疗管理系统源码 手术麻醉临床信息系统有着完善的临床业务功能&#xff0c;能够涵盖整个围术期的工作&#xff0c;能够采集、汇总、存储、处理、展现所有的临床诊疗资料。通过该系统的实施&#xff0c;能够规范麻醉科的工作流…

实现offsetof宏以及交换一个整数二进制奇偶位的宏

目录 1. offsetof宏2. 交换奇偶位 1. offsetof宏 我们想用宏来实现offsetof函数,首先要了解这个函数的用法。 1.1 offsetof函数的介绍及用法 &#xff08;1&#xff09;功能&#xff1a;用来计算结构体中一个成员在该结构体中的相对起始位置的偏移量&#xff0c;单位是字节。 …

ClamAV:Linux服务器杀毒扫描工具

Clam AntiVirus&#xff08;ClamAV&#xff09;是免费而且开放源代码的防毒软件&#xff0c;软件与病毒码的更新皆由社群免费发布。ClamAV在命令行下运行&#xff0c;它不将杀毒作为主要功能&#xff0c;默认只能查出系统内的病毒&#xff0c;但是无法清除。需要用户自行对病毒…

异常,Lambda表达式

文章目录 异常介绍存在形式程序中异常发生后的第一反应体系JVM的默认处理方案处理方式声明 throws概述格式抛出 throw格式注意意义 throws和throw的区别 捕获 try,catch介绍格式执行方式多异常捕获处理意义 如何选择用哪个 Throwable类介绍常用方法 自定义异常概述实现步骤范例…

手写Spring框架(上)浅出

手写Spring框架 准备工作Spring启动和扫描逻辑实现依赖注入的实现Aware回调模拟实现和初始化机制模拟实现BeanPostProcessor (Bean的后置处理器) 模拟实现Spring AOP 模拟实现 准备工作 准备一个空的工程创建spring的容器类&#xff0c;它是Spring IOC理念的实现&#xff0c;负…

Yolo 自制数据集dect训练改进

上一文请看 Yolo自制detect训练-CSDN博客 简介 如下图&#xff1a; 首先看一下每个图的含义 loss loss分为cls_loss, box_loss, obj_loss三部分。 cls_loss用于监督类别分类&#xff0c;计算锚框与对应的标定分类是否正确。 box_loss用于监督检测框的回归&#xff0c;预测框…

算法——距离计算

距离计算常用的算法包括欧氏距离、曼哈顿距离、切比雪夫距离、闵可夫斯基距离、余弦相似度等。这些算法在数据挖掘、机器学习和模式识别等领域中被广泛应用。 1.欧氏距离 欧式距离也称欧几里得距离&#xff0c;是最常见的距离度量&#xff0c;衡量的是多维空间中两个点之间的…

SpringMvc项目创建过程

1、新建空项目 名字和路径自定义&#xff0c;Maven项目&#xff0c;不建议勾选Add sample code 2、创建web模块 选中当前项目 修改路径&#xff0c;注意是在main包下 选择当前项目 3、编写pom.xml文件 在文件中加入以下内容&#xff0c;packaging标签表明了maven打包类型。 &…

Mysql的高级语句3

目录 一、子查询 注意&#xff1a;子语句可以与主语句所查询的表相同&#xff0c;但是也可以是不同表。 1、select in 1.1 相同表查询 1.2 多表查询 2、not in 取反&#xff0c;就是将子查询结果&#xff0c;进行取反处理 3、insert into in 4、update…

【智能算法】黄金正弦算法(GSA)原理及实现

目录 1.背景2.算法原理2.1算法思想2.2算法过程 3.结果展示4.参考文献 1.背景 2017年&#xff0c;Tanyildizi等人受到正弦函数单位圆内扫描启发&#xff0c;提出了黄金正弦算法&#xff08;Golden Sine Algorithm, GSA&#xff09;。 2.算法原理 2.1算法思想 GSA来源于正弦函…

阿里云服务器安装SSL证书不起作用的解决方案

阿里云服务器安装SSL证书不起作用的解决方案 在阿里云安装SSL证书后&#xff0c;访问无效&#xff0c;各种检查证书安装没有问题。忽然想到阿里云默认连80端口都没开启&#xff0c;443端口应该也没开启。 登录阿里云控制台 - 云服务器 ECS - 网络与安全 - 安全组 - 管理规则 - …

http模块 服务器端如何响应(获取)静态资源?

一、静态资源与动态资源介绍&#xff1a; &#xff08;1&#xff09;静态资源 内容长时间不改变的资源。eg&#xff1a;图片、视频、css js html文件、字体文件... &#xff08;2&#xff09;动态资源 内容经常更新的资源。eg&#xff1a;百度首页、淘宝搜索列表... 二、服…

栈————顺序栈和链式栈

目录 栈 顺序栈 1、初始化顺序栈 2、判栈空 3、进栈 4、出栈 5、读栈顶元素 6、遍历 链式栈 1、初始化链式栈 2、断链式栈是否为空判 3、入栈(插入) ​编辑​编辑 4、出栈(删除) 5、读取栈顶元素 6、输出链式栈中各个节点的值&#xff08;遍历&#xff09; 栈 …

【Linux C | 多线程编程】线程的连接、分离,资源销毁情况

&#x1f601;博客主页&#x1f601;&#xff1a;&#x1f680;https://blog.csdn.net/wkd_007&#x1f680; &#x1f911;博客内容&#x1f911;&#xff1a;&#x1f36d;嵌入式开发、Linux、C语言、C、数据结构、音视频&#x1f36d; ⏰发布时间⏰&#xff1a;2024-04-01 1…