HarmonyOS 非线性容器特性及使用场景

非线性容器实现能快速查找的数据结构,其底层通过 hash 或者红黑树实现,包括 HashMap、HashSet、TreeMap、TreeSet、LightWeightMap、LightWeightSet、PlainArray 七种。非线性容器中的 key 及 value 的类型均满足 ECMA 标准。

HashMap

HashMap 可用来存储具有关联关系的 key-value 键值对集合,存储元素中 key 是唯一的,每个 key 会对应一个 value 值。

HashMap 依据泛型定义,集合中通过 key 的 hash 值确定其存储位置,从而快速找到键值对。HashMap 的初始容量大小为 16,并支持动态扩容,每次扩容大小为原始容量的 2 倍。HashMap 底层基于 HashTable 实现,冲突策略采用链地址法。

HashMap 和 TreeMap 相比,HashMap 依据键的 hashCode 存取数据,访问速度较快。而 TreeMap 是有序存取,效率较低。

HashSet 基于 HashMap 实现。HashMap 的输入参数由 key、value 两个值组成。在 HashSet 中,只对 value 对象进行处理。

需要快速存取、删除以及插入键值对数据时,推荐使用 HashMap。

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

在这里插入图片描述

HashSet

HashSet 可用来存储一系列值的集合,存储元素中 value 是唯一的。

HashSet 依据泛型定义,集合中通过 value 的 hash 值确定其存储位置,从而快速找到该值。HashSet 初始容量大小为 16,支持动态扩容,每次扩容大小为原始容量的 2 倍。value 的类型满足 ECMA 标准中要求的类型。HashSet 底层数据结构基于 HashTable 实现,冲突策略采用链地址法。

HashSet 基于 HashMap 实现。在 HashSet 中,只对 value 对象进行处理。

HashSet 和 TreeSet 相比,HashSet 中的数据无序存放,即存放元素的顺序和取出的顺序不一致,而 TreeSet 是有序存放。它们集合中的元素都不允许重复,但 HashSet 允许放入 null 值,TreeSet 不允许。

可以利用 HashSet 不重复的特性,当需要不重复的集合或需要去重某个集合的时候使用。

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

在这里插入图片描述

TreeMap

TreeMap 可用来存储具有关联关系的 key-value 键值对集合,存储元素中 key 是唯一的,每个 key 会对应一个 value 值。

TreeMap 依据泛型定义,集合中的 key 值是有序的,TreeMap 的底层是一棵二叉树,可以通过树的二叉查找快速的找到键值对。key 的类型满足 ECMA 标准中要求的类型。TreeMap 中的键值是有序存储的。TreeMap 底层基于红黑树实现,可以进行快速的插入和删除。

TreeMap 和 HashMap 相比,HashMap 依据键的 hashCode 存取数据,访问速度较快。而 TreeMap 是有序存取,效率较低。

一般需要存储有序键值对的场景,可以使用 TreeMap。

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

在这里插入图片描述

TreeSet

TreeSet 可用来存储一系列值的集合,存储元素中 value 是唯一的。

TreeSet 依据泛型定义,集合中的 value 值是有序的,TreeSet 的底层是一棵二叉树,可以通过树的二叉查找快速的找到该 value 值,value 的类型满足 ECMA 标准中要求的类型。TreeSet 中的值是有序存储的。TreeSet 底层基于红黑树实现,可以进行快速的插入和删除。

TreeSet 基于 TreeMap 实现,在 TreeSet 中,只对 value 对象进行处理。TreeSet 可用于存储一系列值的集合,元素中 value 唯一且有序。

TreeSet 和 HashSet 相比,HashSet 中的数据无序存放,而 TreeSet 是有序存放。它们集合中的元素都不允许重复,但 HashSet 允许放入 null 值,TreeSet 不允许。

一般需要存储有序集合的场景,可以使用 TreeSet。

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

在这里插入图片描述

LightWeightMap

LightWeightMap 可用来存储具有关联关系的 key-value 键值对集合,存储元素中 key 是唯一的,每个 key 会对应一个 value 值。LightWeightMap 依据泛型定义,采用更加轻量级的结构,底层标识唯一 key 通过 hash 实现,其冲突策略为线性探测法。集合中的 key 值的查找依赖于 hash 值以及二分查找算法,通过一个数组存储 hash 值,然后映射到其他数组中的 key 值以及 value 值,key 的类型满足 ECMA 标准中要求的类型。

初始默认容量大小为 8,每次扩容大小为原始容量的 2 倍。

LightWeightMap 和 HashMap 都是用来存储键值对的集合,LightWeightMap 占用内存更小。

当需要存取 key-value 键值对时,推荐使用占用内存更小的 LightWeightMap。

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

在这里插入图片描述

LightWeightSet

LightWeightSet 可用来存储一系列值的集合,存储元素中 value 是唯一的。

LightWeightSet 依据泛型定义,采用更加轻量级的结构,初始默认容量大小为 8,每次扩容大小为原始容量的 2 倍。集合中的 value 值的查找依赖于 hash 以及二分查找算法,通过一个数组存储 hash 值,然后映射到其他数组中的 value 值,value 的类型满足 ECMA 标准中要求的类型。

LightWeightSet 底层标识唯一 value 基于 hash 实现,其冲突策略为线性探测法,查找策略基于二分查找法。

LightWeightSet 和 HashSet 都是用来存储键值的集合,LightWeightSet 的占用内存更小。

当需要存取某个集合或是对某个集合去重时,推荐使用占用内存更小的 LightWeightSet。

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

在这里插入图片描述

PlainArray

PlainArray 可用来存储具有关联关系的键值对集合,存储元素中 key 是唯一的,并且对于 PlainArray 来说,其 key 的类型为 number 类型。每个 key 会对应一个 value 值,类型依据泛型的定义,PlainArray 采用更加轻量级的结构,集合中的 key 值的查找依赖于二分查找算法,然后映射到其他数组中的 value 值。

初始默认容量大小为 16,每次扩容大小为原始容量的 2 倍。

PlainArray 和 LightWeightMap 都是用来存储键值对,且均采用轻量级结构,但 PlainArray 的 key 值类型只能为 number 类型。

当需要存储 key 值为 number 类型的键值对时,可以使用 PlainArray。

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

在这里插入图片描述

非线性容器的使用

此处列举常用的非线性容器 HashMap、TreeMap、LightWeightMap、PlainArray 的使用示例,包括导入模块、增加元素、访问元素及修改等操作,示例代码如下所示:

// HashMap
import HashMap from '@ohos.util.HashMap'; // 导入HashMap模块
let hashMap = new HashMap();
hashMap.set('a', 123);
hashMap.set(4, 123); // 增加元素
console.info(`result: ${hashMap.hasKey(4)}`); // 判断是否含有某元素
console.info(`result: ${hashMap.get('a')}`); // 访问元素
// TreeMap
import TreeMap from '@ohos.util.TreeMap'; // 导入TreeMap模块
let treeMap = new TreeMap();
treeMap.set('a', 123);
treeMap.set('6', 356); // 增加元素
console.info(`result: ${treeMap.get('a')}`); // 访问元素
console.info(`result: ${treeMap.getFirstKey()}`); // 访问首元素
console.info(`result: ${treeMap.getLastKey()}`); // 访问尾元素
// LightWeightMap
import LightWeightMap from '@ohos.util.LightWeightMap'; // 导入LightWeightMap模块
let lightWeightMap = new LightWeightMap();
lightWeightMap.set('x', 123);
lightWeightMap.set('8', 356); // 增加元素
console.info(`result: ${lightWeightMap.get('a')}`); // 访问元素
console.info(`result: ${lightWeightMap.get('x')}`); // 访问元素
console.info(`result: ${lightWeightMap.getIndexOfKey('8')}`); // 访问元素
// PlainArray
import PlainArray from '@ohos.util.PlainArray' // 导入PlainArray模块
let plainArray = new PlainArray();
plainArray.add(1, 'sdd');
plainArray.add(2, 'sff'); // 增加元素
console.info(`result: ${plainArray.get(1)}`); // 访问元素
console.info(`result: ${plainArray.getKeyAt(1)}`); // 访问元素

那么要想成为一名鸿蒙高级开发,以上知识点是必须要掌握的,除此之外,还需要掌握一些鸿蒙应用开发相关的一些技术,需要我们共同去探索。

为了能够让大家跟上互联网时代的技术迭代,在这里我特邀了几位行业大佬整理出一份最新版的鸿蒙学习提升资料,有需要的小伙伴自行领取,限时开源,先到先得~~~~

领取以下高清学习路线原图请点击→《鸿蒙 (Harmony OS)开发学习手册》纯血鸿蒙HarmonyOS基础技能学习路线图

在这里插入图片描述


领取以上完整高清学习路线图,请点击→《鸿蒙基础入门学习指南》小编自己整理的部分学习资料(包含有高清视频、开发文档、电子书籍等)

在这里插入图片描述

以上分享的学习路线都适合哪些人跟着学习?

-应届生/计算机专业
通过学习鸿蒙新兴技术,入行互联网,未来高起点就业。
-0基础转行
提前布局新方向,抓住风口,自我提升,获得更多就业机会。
-技术提升/进阶跳槽
发展瓶颈期,提升职场竞争力,快速掌握鸿蒙技术,享受蓝海红利。

在这里插入图片描述

最后

鸿蒙开发学习是一个系统化的过程,从基础知识的学习到实战技能的锤炼,再到对前沿技术的探索,每一环节都至关重要。希望这份教程资料能帮助您快速入门并在鸿蒙开发之路上步步攀升,成就一番事业。让我们一起乘风破浪,拥抱鸿蒙生态的广阔未来!

如果你觉得这篇内容对你有帮助,我想麻烦大家动动小手给我:点赞,转发,有你们的 『点赞和评论』,才是我创造的动力。

关注我,同时可以期待后续文章ing,不定期分享原创知识。

想要获取更多完整鸿蒙最新VIP学习资料,请点击→《鸿蒙HarmonyOS分布式项目实战》

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

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

相关文章

Linux——信号量

目录 POSIX信号量 信号量原理 信号量概念 信号量函数 基于环形队列的生产者消费者模型 生产者和消费者申请和释放资源 单生产者单消费者 多生产者多消费者 多生产者多消费者的意义 信号量的意义 POSIX信号量 信号量原理 如果仅用一个互斥锁对临界资源进行保护&#…

path模块

一、path模块作用 path模块提供了操作路径的功能 二、语法 (1) path.resolve 拼接规范的绝对路径 常用 (2) path.sep 获取操作系统的路径分隔符 (3) path.parse 解析路径并且返回对象 (4) path.basename 获取路径的基本名称 (5) path.dirname 获取路径的目录名 …

Android NDK入门:在应用中加入C和C++的力量

目录 ​编辑 引 NDK的设计目的 与Java/Kotlin的结合 使用场景 开发流程 设置项目以支持NDK 编写本地代码 使用JNI连接本地代码和Java/Kotlin代码 编译和运行你的应用 附 引 自诩方向是android方向的移动端开发工程师,却从来没有真正仔细了解过NDK&#…

【Unity】Tag、Layer、LayerMask

文章目录 层(Layer)什么是LayerLayer的应用场景Layer层的配置(Tags & Layers)Layer的数据结构LayerMaskLayer的选中和忽略Layer的管理(架构思路)层碰撞矩阵设置(Layer Collision Matrix&…

Could not transform the global plan to the frame of the controller

报错: [ERROR] [1710509295.679888409, 296.695000000]: Extrapolation Error: Lookup would require extrapolation 0.003000000s into the future. Requested time 295.747000000 but the latest data is at time 295.744000000, when looking up transform from…

智能视频生产平台解决方案介绍

视频内容已经成为企业宣传、营销、培训等多维度沟通的重要媒介,美摄科技凭借其在智能视频生产领域的深厚积累和创新能力,推出了面向企业的智能视频生产平台解决方案,为企业提供多端多场景的智能化视频生产工具,助力企业轻松打造高…

C语言进阶:顺序表(数据结构基础) (以通讯录项目为代码练习)

和黛玉学编程呀 C语言基础知识也完成了,所以就来谈谈数据结构吧,这篇主要是为了连接数据结构和C语言 很高兴又和大家见面啦,这节我们就讲顺序表,一起加油> 目录 数据结构相关概念 顺序表(线性表,顺序…

【研发日记】Matlab/Simulink技能解锁(一)——在Simulink编辑窗口Debug

文章目录 前言 时间阈值断点 信号阈值断点 周期步进 Signal Value Lable Data Inspector 分析和应用 总结 前言 近期在一些研发项目中使用Matlab/Simulink时,遇到了挺多费时费力的事情。所以利用晚上和周末时间,在这些方面深入研究了一下&#x…

大话设计模式——7.抽象工厂模式(Abstract Factory Pattern)

1.介绍 抽象工厂模式是工厂模式的进一步优化,提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。属于创建型模式。 UML图: 2.示例 车辆制造工厂,不仅可以制造轿车也可以用来生产自行车。 1)Abs…

孪生网络(Siamese Network)和数字孪生的区别?

1. 孪生网络 孪生网络是一种特殊的网络框架,基于两个人工神经网络建立的耦合构架,通过比较两个样本在高维度空间的表征来判断它们的相似程度。它包含两个相同结构的神经网络,一个用于学习,一个用于验证学习效果。在训练过程中&am…

十、项目沟通管理

十、项目沟通管理 从马斯洛需求的各个层级上,都需要沟通的介入。如果缺乏沟通,甚至可能严重损伤身心健康。 沟通渠道 1、 规划沟通管理 ​ 规划沟通管理是基于每个相关方或相关方群体的信息需求、可用的组织资产,以及具体项目的需求&#x…

基于springboot+vue实现养老服务管理系统项目【项目源码+论文说明】计算机毕业设计

基于springbootvue实现养老服务管理系统演示 摘要 医疗水平和生活水平的不断提高造就了我们现在稳定、发展的社会,带来受益的同时也加重了人口老龄化程度。随着人口老龄化程度的不断加深,越来越多的社会资源在对养老方面注入。那么面对如此快速发展的养…