0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

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

王程 来源:jf_75796907 作者:jf_75796907 2024-02-19 20:23 次阅读

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 如下:

操作 描述
增加元素 通过 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) => void, thisArg?: Object) 访问整个 map 的元素。
通过 Symbol.iterator:IterableIterator<[K,V]> 迭代器进行数据访问。
修改元素 通过 replace (key: K, newValue: V) 对指定 key 对应的 value 值进行修改操作。
通过 forEach (callbackFn: (value?: V, key?: K, map?: HashMap) => void, thisArg?: Object) 对 map 中元素进行修改操作。
删除元素 通过 remove (key: K) 对 map 中匹配到的键值对进行删除操作。
通过 clear () 清空整个 map 集合。

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 如下:

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

TreeMap

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

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

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

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

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) => void, thisArg?: Object) 访问整个 map 的元素。
通过 Symbol.iterator:IterableIterator<[K,V]> 迭代器进行数据访问。
修改元素 通过 replace (key: K,newValue: V) 对指定 key 对应的 value 值进行修改操作。
通过 forEach (callbackFn: (value?: V, key?: K, map?: TreeMap) => void, thisArg?: Object) 对 map 中元素进行修改操作。
删除元素 通过 remove (key: K) 对 map 中匹配到的键值对进行删除操作。
通过 clear () 清空整个 map 集合。

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 如下:

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

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 如下:

操作 描述
增加元素 通过 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) => void, thisArg?: Object) 访问整个 map 的元素
通过 Symbol.iterator:IterableIterator<[K,V]> 迭代器进行数据访问。
修改元素 通过 setValueAt (index: number, newValue: V) 对指定 index 对应的 value 值进行修改操作。
通过 forEach (callbackFn: (value?: V, key?: K, map?: LightWeightMap) => void, thisArg?: Object) 对 map 中元素进行修改操作。
删除元素 通过 remove (key: K) 对 map 中匹配到的键值对进行删除操作。
通过 removeAt (index: number) 对 map 中指定 index 的位置进行删除操作。
通过 clear () 清空整个 map 集合。

LightWeightSet

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

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

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

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

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

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) => void, thisArg?: Object) 访问整个 set 的元素。
通过 Symbol.iterator:IterableIterator 迭代器进行数据访问。
修改元素 通过 forEach (callbackFn: (value?: T, key?: T, set?: LightWeightSet) => void, thisArg?: Object) 对 set 中元素进行修改操作。
删除元素 通过 remove (key: K) 对 set 中匹配到的键值对进行删除操作。
通过 removeAt (index: number) 对 set 中指定 index 的位置进行删除操作。
通过 clear () 清空整个 set 集合。

PlainArray

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

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

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

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

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) => void, thisArg?: Object) 访问整个 plainarray 的元素。
通过 Symbol.iterator:IterableIterator<[number, T]> 迭代器进行数据访问。
修改元素 通过 setValueAt (index:number, value: T) 对指定 index 对应的 value 值进行修改操作。
通过 forEach (callbackFn: (value: T, index?: number, PlainArray?: PlainArray) => 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 的使用示例,包括导入模块、增加元素、访问元素及修改等操作,示例代码如下所示:

// 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)}`); // 访问元素


审核编辑 黄宇

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 非线性
    +关注

    关注

    1

    文章

    172

    浏览量

    22905
  • hashmap
    +关注

    关注

    0

    文章

    12

    浏览量

    2248
  • HarmonyOS
    +关注

    关注

    79

    文章

    1853

    浏览量

    29267
收藏 人收藏

    评论

    相关推荐

    ADC的积分非线性和微分非线性

    ADC的积分非线性和微分非线性模数器件的精度指标是用积分非线性度(Interger NonLiner) 即 INL 值来表示,INL可以理解为精度;4.095/4096=0.001V,单位INL的值
    发表于 03-24 18:08

    如何对测量非线性电阻伏安特性的电路进行multisim仿真?

    如何对测量非线性电阻伏安特性的电路进行multisim仿真?
    发表于 04-27 16:10

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

    线性容器实现能按顺序访问的数据结构,其底层主要通过数组实现,包括ArrayList、Vector、List、LinkedList、Deque、Queue、Stack七种。 线性容器,充
    发表于 09-27 15:10

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

    非线性容器实现能快速查找的数据结构,其底层通过hash或者红黑树实现,包括HashMap、HashSet、TreeMap、TreeSet、LightWeightMap、LightWeightSet
    发表于 09-27 15:18

    HarmonyOS语言基础类库开发指南上线啦!

    自身功能的基础上去除冗余逻辑,保证了数据的高效访问,提升了应用的性能。 当前提供了线性非线性两类容器,共14种。每种容器都有自身的特性及使
    发表于 10-18 16:36

    非线性电阻电路分析

    非线性电阻电路􀂄 4.1 非线性电阻元件的特性􀂄 4.2 非线性电阻电路的方程􀂄 4.3 图解分析法􀂄 4.4
    发表于 12-04 18:07 0次下载
    <b class='flag-5'>非线性</b>电阻电路分析

    非线性系统辨识

    激光焊接过程是典型的具有噪声和扰动影响的非线性系统。利用Hammerstein 模型的线性非线性分离的特性可以建立起关于激光焊接过程的非线性
    发表于 12-22 14:09 10次下载

    基于OTA的模拟元件电路非线性特性建模

    研究了一种典型CMOS 源耦合差分对管电路(OTA)的非线性特性,得到非线性失真项。据此,导出了由OTA 构成模拟电阻和模拟电感以及其他一些模拟元件电路的非线性
    发表于 01-07 14:52 17次下载

    非线性电阻特性研究

    非线性电阻特性研究   若通过元件的电流强度与施加到它的两端的电压之间不是线性关系.就称这种元件为非线性元件 . 由于通过元件的电
    发表于 11-24 15:20 3635次阅读
    <b class='flag-5'>非线性</b>电阻<b class='flag-5'>特性</b>研究

    非线性部件的模拟

    非线性部件的模拟 所谓非线性特性,是指它的输出与输入信号之间的关系是非线性.在实际物理系统中,往往许多部件在不同程度上都
    发表于 07-25 10:54 1271次阅读
    <b class='flag-5'>非线性</b>部件的模拟

    自激电子镇流器非线性控制特性研究

    本文运用基于频域的Tsypkin轨迹法和基于时域的Hamel轨迹法对该非线性系统的控制特性作了详细的分析。通过一个36W 的自激LC 串联谐振 联负载型电子镇流器的设计和实验,
    发表于 02-16 17:52 55次下载
    自激电子镇流器<b class='flag-5'>非线性</b>控制<b class='flag-5'>特性</b>研究

    运算放大电路的非线性特性

    特性的系统的。作为课程的补充,下面讨论一下不为人所重视的运算放大电路的非线性特性。 ▌01 运算放大器的非线性 1.运算放大电路 作为信号处理的常用器件,运算放大器,在其信号处理范围之
    的头像 发表于 03-10 16:06 1.3w次阅读
    运算放大电路的<b class='flag-5'>非线性</b><b class='flag-5'>特性</b>

    面向非线性动态的保精度-稀疏特性核回归模型

    面向非线性动态的保精度-稀疏特性核回归模型
    发表于 07-02 15:00 3次下载

    线性负载什么意思?非线性负载是什么意思?

    的。 非线性负载是指在电路中,电流和电压之间的关系不是简单的线性关系。非线性负载通常包括电子器件、晶体管、二极管等,这些元件的电流与电压之间的关系是非线性的。 在实际电路中,
    的头像 发表于 11-13 16:10 1251次阅读

    线性电阻和非线性电阻的区别

    线性电阻和非线性电阻的区别  线性电阻和非线性电阻是两种常见的电子元件,它们在电路中具有不同的特性和行为。本文将详尽、详实、细致地讨论
    的头像 发表于 12-07 17:03 743次阅读