鸿蒙开发-ArkTS语言-容器-非线性容器
鸿蒙开发-UI-web
鸿蒙开发-UI-web-页面
鸿蒙开发-ArkTS语言-基础类库
鸿蒙开发-ArkTS语言-并发
鸿蒙开发-ArkTS语言-并发-案例
鸿蒙开发-ArkTS语言-容器
文章目录
前言
一、非线性容器
1.HashMap
2.HashSet
3.TreeMap
4.TreeSet
5.LightWeightMap
6.LightWeightSet
7.PlainArray
二、非线性容器使用
总结
前言
上文详细学习鸿蒙开发ArkTS语言容器类库线性容器的特点以及常见操作的API,本文将学习非线性容器的相关知识。
一、非线性容器
非线性容器实现能快速查找的数据结构,其底层通过hash或者红黑树实现,包括HashMap、HashSet、TreeMap、TreeSet、LightWeightMap、LightWeightSet、PlainArray七种
1.HashMap

常用API如下:
| 操作 | 描述 |
|---|---|
| 增加元素 | 通过set(key: K, value: V)函数每次在HashMap增加一个键值对。 |
| 访问元素 | 通过get(key: K)获取key对应的value值。 |
| 通过keys()返回一个迭代器对象,包含map中的所有key值。 | |
| 通过values()返回一个迭代器对象,包含map中的所有value值。 | |
| 通过entries()返回一个迭代器对象,包含map中的所有键值对。 | |
| forEach(callbackFn: (value?: V, key?: K, map?: HashMap<K, V>) => void, thisArg?: Object)访问整个map的元素。 | |
| 通过[Symbol.iterator]():IterableIterator<[K,V]>迭代器进行数据访问。 | |
| 修改元素 | 通过replace(key: K, newValue: V)对指定key对应的value值进行修改操作。 |
| 通过forEach(callbackFn: (value?: V, key?: K, map?: HashMap<K, V>) => void, thisArg?: Object)对map中元素进行修改操作。 | |
| 删除元素 | 通过remove(key: K)对map中匹配到的键值对进行删除操作。 |
| 通过clear()清空整个map集合。 |
2.HashSet

常用API如下:
| 操作 | 描述 |
|---|---|
| 增加元素 | 通过add(value: T)函数每次在HashSet增加一个值。 |
| 访问元素 | 通过values()返回一个迭代器对象,包含set中的所有value值。 |
| 通过entries()返回一个迭代器对象,包含类似键值对的数组,键值都是value。 | |
| 通过forEach(callbackFn: (value?: T, key?: T, set?: HashSet<T>) => void, thisArg?: Object)访问整个set的元素。 | |
| 通过[Symbol.iterator]():IterableIterator<T>迭代器进行数据访问。 | |
| 修改元素 | 通过forEach(callbackFn: (value?: T, key?: T, set?: HashSet<T>) => void, thisArg?: Object)对set中value进行修改操作。 |
| 删除元素 | 通过remove(value: T)对set中匹配到的值进行删除操作。 |
| 通过clear()清空整个set集合。 |
3.TreeMap

常用API如下:
| 操作 | 描述 |
|---|---|
| 增加元素 | 通过set(key: K,value: V)函数每次在TreeMap增加一个键值对。 |
| 访问元素 | 通过get(key: K)获取key对应的value值。 |
| 通过getFirstKey()获取map中排在首位的key值。 | |
| 通过getLastKey()获取map中排在未位的key值。 | |
| 通过keys()返回一个迭代器对象,包含map中的所有key值。 | |
| 通过values()返回一个迭代器对象,包含map中的所有value值。 | |
| 通过entries()返回一个迭代器对象,包含map中的所有键值对。 | |
| 通过forEach(callbackFn: (value?: V, key?: K, map?: TreeMap<K, V>) => void, thisArg?: Object)访问整个map的元素。 | |
| 通过[Symbol.iterator]():IterableIterator<[K,V]>迭代器进行数据访问。 | |
| 修改元素 | 通过replace(key: K,newValue: V)对指定key对应的value值进行修改操作。 |
| 通过forEach(callbackFn: (value?: V, key?: K, map?: TreeMap<K, V>) => void, thisArg?: Object)对map中元素进行修改操作。 | |
| 删除元素 | 通过remove(key: K)对map中匹配到的键值对进行删除操作。 |
| 通过clear()清空整个map集合。 |
4.TreeSet

常用API如下:
| 操作 | 描述 |
|---|---|
| 增加元素 | 通过add(value: T)函数每次在TreeSet增加一个值。 |
| 访问元素 | 通过values()返回一个迭代器对象,包含set中的所有value值。 |
| 通过entries()返回一个迭代器对象,包含类似键值对的数组,键值都是value。 | |
| 通过getFirstValue()获取set中排在首位的value值。 | |
| 通过getLastValue()获取set中排在未位的value值。 | |
| 通过forEach(callbackFn: (value?: T, key?: T, set?: TreeSet<T>) => void, thisArg?: Object)访问整个set的元素。 | |
| 通过[Symbol.iterator]():IterableIterator<T>迭代器进行数据访问。 | |
| 修改元素 | 通过forEach(callbackFn: (value?: T, key?: T, set?: TreeSet<T>) => void, thisArg?: Object)对set中value进行修改操作。 |
| 删除元素 | 通过remove(value: T)对set中匹配到的值进行删除操作。 |
| 通过clear()清空整个set集合。 |
5.LightWeightMap

常用API如下:
| 操作 | 描述 |
|---|---|
| 增加元素 | 通过set(key: K,value: V)函数每次在LightWeightMap增加一个键值对。 |
| 访问元素 | 通过get(key: K)获取key对应的value值。 |
| 通过getIndexOfKey(key: K)获取map中指定key的index。 | |
| 通过getIndexOfValue(value: V)获取map中指定value出现的第一个的index。 | |
| 通过keys()返回一个迭代器对象,包含map中的所有key值。 | |
| 通过values()返回一个迭代器对象,包含map中的所有value值。 | |
| 通过entries()返回一个迭代器对象,包含map中的所有键值对。 | |
| 通过getKeyAt(index: number)获取指定index对应的key值。 | |
| 通过getValueAt(index: number)获取指定index对应的value值。 | |
| 通过forEach(callbackFn: (value?: V, key?: K, map?: LightWeightMap<K, V>) => void, thisArg?: Object)访问整个map的元素。 | |
| 通过[Symbol.iterator]():IterableIterator<[K,V]>迭代器进行数据访问。 | |
| 修改元素 | 通过setValueAt(index: number, newValue: V)对指定index对应的value值进行修改操作。 |
| 通过forEach(callbackFn: (value?: V, key?: K, map?: LightWeightMap<K, V>) => void, thisArg?: Object)对map中元素进行修改操作。 | |
| 删除元素 | 通过remove(key: K)对map中匹配到的键值对进行删除操作。 |
| 通过removeAt(index: number)对map中指定index的位置进行删除操作。 | |
| 通过clear()清空整个map集合。 |
6.LightWeightSet

常用API如下:
| 操作 | 描述 |
|---|---|
| 增加元素 | 通过add(obj: T)函数每次在LightWeightSet增加一个值。 |
| 访问元素 | 通过getIndexOf(key: T)获取对应的index值。 |
| 通过values()返回一个迭代器对象,包含map中的所有value值。 | |
| 通过entries()返回一个迭代器对象,包含map中的所有键值对。 | |
| 通过getValueAt(index: number)获取指定index对应的value值。 | |
| 通过forEach(callbackFn: (value?: T, key?: T, set?: LightWeightSet<T>) => void, thisArg?: Object)访问整个set的元素。 | |
| 通过[Symbol.iterator]():IterableIterator<T>迭代器进行数据访问。 | |
| 修改元素 | 通过forEach(callbackFn: (value?: T, key?: T, set?: LightWeightSet<T>) => void, thisArg?: Object)对set中元素进行修改操作。 |
| 删除元素 | 通过remove(key: K)对set中匹配到的键值对进行删除操作。 |
| 通过removeAt(index: number)对set中指定index的位置进行删除操作。 | |
| 通过clear()清空整个set集合。 |
7.PlainArray

常用API如下:
| 操作 | 描述 |
|---|---|
| 增加元素 | 通过add(key: number,value: T)函数每次在PlainArray增加一个键值对。 |
| 访问元素 | 通过get(key: number)获取key对应的value值。 |
| 通过getIndexOfKey(key: number)获取PlainArray中指定key的index。 | |
| 通过getIndexOfValue(value: T)获取PlainArray中指定value的index。 | |
| 通过getKeyAt(index: number)获取指定index对应的key值。 | |
| 通过getValueAt(index: number)获取指定index对应的value值。 | |
| 通过forEach(callbackFn: (value: T, index?: number, PlainArray?: PlainArray<T>) => void, thisArg?: Object)访问整个plainarray的元素。 | |
| 通过[Symbol.iterator]():IterableIterator<[number, T]>迭代器进行数据访问。 | |
| 修改元素 | 通过setValueAt(index:number, value: T)对指定index对应的value值进行修改操作。 |
| 通过forEach(callbackFn: (value: T, index?: number, PlainArray?: PlainArray<T>) => void, thisArg?: Object)对plainarray中元素进行修改操作。 | |
| 删除元素 | 通过remove(key: number)对plainarray中匹配到的键值对进行删除操作。 |
| 通过removeAt(index: number)对plainarray中指定index的位置进行删除操作。 | |
| 通过removeRangeFrom(index: number, size: number)对plainarray中指定范围内的元素进行删除操作。 | |
| 通过clear()清空整个PlainArray集合。 |
二、非线性容器使用
非线性容器HashMap、TreeMap、LightWeightMap、PlainArray的使用示例

总结
本文详细学习鸿蒙开发ArkTS语言容器类库非线性容器的特点以及常见操作的API,下文将学习XML生成、解析与转换相关知识。
相关文章:
鸿蒙开发-ArkTS语言-容器-非线性容器
鸿蒙开发-UI-web 鸿蒙开发-UI-web-页面 鸿蒙开发-ArkTS语言-基础类库 鸿蒙开发-ArkTS语言-并发 鸿蒙开发-ArkTS语言-并发-案例 鸿蒙开发-ArkTS语言-容器 文章目录 前言 一、非线性容器 1.HashMap 2.HashSet 3.TreeMap 4.TreeSet 5.LightWeightMap 6.LightWeightSet 7.P…...
【C语言】指针篇- 深度解析Sizeof和Strlen:热门面试题探究(5/5)
🌈个人主页:是店小二呀 🌈C语言笔记专栏:C语言笔记 🌈C笔记专栏: C笔记 🌈喜欢的诗句:无人扶我青云志 我自踏雪至山巅 文章目录 一、简单介绍Sizeof和Strlen1.1 Sizeof1.2 Strlen函数1.3 Sie…...
【设计模式】单例模式的前世今生
文章目录 引言简介起航!向“确保某个类在系统中只有一个实例”进发 ⛵️Lazy SingletonDouble-checked locking(DCL) SingletonVolatile SingletonAtomic SingletonMeyers Singleton 附:C静态对象的初始化 引言 说起单例模式&…...
厦门网上在线教育系统,线下老师怎么转型到线上网上授课?
现在很多 线下老师都想转到线上做网课,但是在转线上过程中会出现很多问题,很多人都不知道怎么开始,今天小编和大家说一下要注意的。 一、你要有一套适合线上的教学视频 首先你要准备做的课程内容是什么,怎么讲,讲什么&…...
Spring底层入门(九)
boot的执行流程分为构造SpringApplication对象、调用run方法两部分 1、Spring Boot 执行流程-构造 通常我们会在SpringBoot的主启动类中写以下的代码: 参数一是当前类的字节码,参数二是main的args参数。 public class StartApplication {public static…...
掌握Android Fragment开发之魂:Fragment的深度解析(下)
在上一篇文章中,我们深入探讨了Fragment 通信,包含Fragment 向 Activity 传递数据、Activity 向 Fragment 传递数据、Fragment 之间的通信方式。感兴趣的朋友,请前往查阅: 掌握Android Fragment开发之魂:Fragment的深度…...
小巧简单实用的Linux端口转发工具Rinetd
Linux下实现端口转发有很多种方法,尤其是在可以联网的情况下,更是容易。最近在资源受限的定制系统中,找到一个方便离线安装和使用的端口转发工具Rinetd,安装包仅几十K,而且有很多版本的Linux发行系统的支持。 1、安装…...
HackBar 新手使用教程(入门)
啥是Hackbar? Hackbar是一个Firefox 的插件,它的功能类似于地址栏,但是它里面的数据不受服务器的相应触发的重定向等其它变化的影响。 有网址的载入于访问,联合查询,各种编码,数据加密功能。 这个Hackbar可以帮助你在测试SQL注入,XSS漏洞和网站的安全性,主要是帮助…...
<Linux> 权限
目录 权限人员相对于文件来说的分类更改权限文件的拥有者与所属组umask粘滞位 权限 权限是操作系统用来限制对资源访问的机制,权限一般分为读、写、执行。系统中的每个文件都拥有特定的权限、所属用户及所属组,通过这样的机制来限制哪些用户、哪些组可以…...
Nacos Docker 快速部署----解决nacos鉴权漏洞问题
Nacos Docker 快速部署 1. 说明 1.1 官方文档 官方地址 https://nacos.io/zh-cn/docs/v2/quickstart/quick-start.html docker启动文件的gitlhub地址 https://github.com/nacos-group/nacos-docker.git 问题: 缺少部分必要配置与说明 1.2 部署最新版本Nacos&…...
存储或读取时转换JSON数据
一、 数据库类型 二、使用Hutool工具 存储时将数据转换为JSON数据 获取时将JSON数据转换为对象 发现问题: 原本数据对象是Address 和 Firend但是转换完成后数据变成了JSONArray和JSONObject 三、自定义TypeHandler继承Mybatis的BaseTypeHandler处理器 package …...
Spring Data JPA的作用和用法
Spring Data JPA 是 Spring 框架的一个模块,它提供了一种数据访问抽象,允许以一种声明式和简洁的方式来处理数据库操作。它基于 Java Persistence API (JPA),是一个行业标准的 ORM(对象关系映射)规范,用于将…...
【go项目01_学习记录08】
学习记录 1 模板文件1.1 articlesStoreHandler() 使用模板文件1.2 统一模板 1 模板文件 重构 articlesCreateHandler() 和 articlesStoreHandler() 函数,将 HTML 抽离并放置于独立的模板文件中。 1.1 articlesStoreHandler() 使用模板文件 . . . func articlesSt…...
Java中的线程
一、创建线程的几种方式? ① 通过继承Thread类并重写run方法 ,实现简单但不可以继承其他类 Thread底层也是实现了Runnable接口,重写的是run而不是start方法 ②实现Runnable接口并重写run方法, 避免了单继承的局限性ÿ…...
顺序表的实现(迈入数据结构的大门)(完整代码)
seqlist.h #pragma once typedef int SLDataType;#include<stdio.h> #include<stdlib.h> #include<assert.h>typedef struct SeqList {SLDataType* a;int size; // 有效数据个数int capacity; // 空间容量 }SL;//初始化和销毁 void SLInit(SL* ps); void SL…...
neo4j-5.11.0安装APOC插件or配置允许使用过程的权限
在已经安装好neo4j和jdk的情况下安装apoc组件,之前使用neo4j-community-4.4.30,可以找到配置apoc-4.4.0.22-all.jar,但是高版本neo4j对应没有apoc-X.X.X-all.jar。解决如下所示: 1.安装好JDK与neo4j 已经安装对应版本的JDK 17.0…...
mybatis 中 #{}和 ${}的区别是什么?
在 MyBatis 中,#{} 和 ${} 是两种用于参数替换的语法,但它们之间存在一些重要的区别,主要体现在安全性、预编译和动态 SQL 上。 安全性: #{}:这是预编译处理,MyBatis 会为传入的参数生成 PreparedStatement…...
深入解析C#中的接口设计原则
深入解析C#中的接口设计原则 目录 深入解析C#中的接口设计原则 一、接口设计的SOLID原则 二、接口设计的最佳实践 三、接口设计的高级技术 四、结论 接口在面向对象编程中扮演着至关重要的角色。它们是定义行为契约的一种方式,允许实现者提供这些行为的具体实现…...
106短信群发平台在金融和法务行业的应用分析
一、金融行业应用 1.客户通知与提醒:银行、证券、保险等金融机构经常需要向客户发送各类通知和提醒,如账户余额变动、交易确认、扣费通知、理财产品到期提醒等。106短信群发平台可以快速、准确地将这些信息发送到客户的手机上,确保客户及时获…...
Spring AOP(2)
目录 Spring AOP详解 PointCut 切面优先级Order 切点表达式 execution表达式 切点表达式示例 annotation 自定义注解MyAspect 切面类 添加自定义注解 Spring AOP详解 PointCut 上面代码存在一个问题, 就是对于excution(* com.example.demo.controller.*.*(..))的大量重…...
COMSOL声学建模实战:从无源特征频率到有源辐射边界
1. COMSOL声学建模基础:从理论到实践 声学建模在工程领域应用广泛,无论是建筑声学设计、噪声控制还是音频设备开发,都需要对声波传播特性有深入理解。COMSOL Multiphysics作为一款强大的多物理场仿真软件,提供了完整的声学建模解决…...
ModernBERT:用现代训练技术重塑经典BERT,实现性能与效率双提升
1. 项目概述:为什么我们需要一个“现代”的BERT?如果你在过去几年里深度参与过自然语言处理(NLP)项目,那么对BERT这个名字一定不会陌生。作为Transformer架构在预训练领域的里程碑,BERT彻底改变了我们处理文…...
AI驱动个人网站生成器:基于Next.js与OpenAI的配置化数字名片
1. 项目概述:一个AI驱动的个人数字名片最近在折腾个人品牌和在线展示,发现了一个挺有意思的开源项目:zachlagden/iamjarvis.xyz。这本质上是一个基于AI的个人网站生成器,或者说,是一个高度定制化的“数字名片”。它的核…...
数字电路小白也能懂:用Logisim搞定LED计数电路,从真值表到封装测试保姆级教程
数字电路零基础实战:用Logisim构建LED计数器的完整指南 从困惑到清晰:为什么选择Logisim作为数字电路入门工具 第一次接触数字电路时,面对密密麻麻的逻辑门和抽象的真值表,大多数初学者都会感到无从下手。传统教材中复杂的公式推导…...
为什么OpenVSP是航空航天工程师的“参数化建模瑞士军刀“?5个实战场景深度解析
为什么OpenVSP是航空航天工程师的"参数化建模瑞士军刀"?5个实战场景深度解析 【免费下载链接】OpenVSP A parametric aircraft geometry tool 项目地址: https://gitcode.com/gh_mirrors/ope/OpenVSP 在飞机设计领域,传统CAD软件的复杂…...
Obsidian Importer:一站式笔记数据迁移终极指南
Obsidian Importer:一站式笔记数据迁移终极指南 【免费下载链接】obsidian-importer Obsidian Importer lets you import notes from other apps and file formats into your Obsidian vault. 项目地址: https://gitcode.com/gh_mirrors/ob/obsidian-importer …...
利用 Taotoken 模型广场为不同智能体任务选择合适的模型
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 利用 Taotoken 模型广场为不同智能体任务选择合适的模型 在设计多智能体系统时,一个常见的挑战是如何为系统中承担不同…...
别再傻傻分不清!5分钟搞懂NMOS和PMOS,从符号到选型一次讲透
5分钟掌握NMOS与PMOS实战技巧:从符号识别到精准选型 1. 初识MOS管:电子世界的交通警察 想象一下,你正面对一堆外形相似的MOS管,就像站在十字路口的交警,需要迅速判断每辆车的行驶方向。NMOS和PMOS正是电子电路中的&quo…...
基于SpringBoot+Vue的CRM客户管理系统毕设
博主介绍:✌ 专注于Java,python,✌关注✌私信我✌具体的问题,我会尽力帮助你。一、研究目的本研究旨在构建一个基于Spring Boot与Vue框架的CRM客户管理系统以解决传统客户关系管理中存在的信息孤岛现象与业务流程低效问题。当前企业客户管理普遍面临数据…...
单片机显示开发避坑:手把手教你用C语言搞定RGB888、RGB565和RGB666的颜色格式转换
单片机显示开发实战:C语言高效处理RGB888、RGB565与RGB666格式转换 当你在STM32或ESP32上驱动一块LCD屏幕时,是否遇到过这样的场景:精心设计的UI界面在屏幕上显示时,颜色却变得怪异扭曲?这往往源于颜色格式的错配——你…...
