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<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集合。

HashSet

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

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

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

HashSet和 TreeSet 相比,HashSet中的数据无序存放,即存放元素的顺序和取出的顺序不一致,而TreeSet是有序存放。它们集合中的元素都不允许重复,但HashSet允许放入null值,TreeSet不建议存放null值,可能会对排序结果产生影响。

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

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集合。

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<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集合。

TreeSet

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

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

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

TreeSet和 HashSet 相比,HashSet中的数据无序存放,而TreeSet是有序存放。它们集合中的元素都不允许重复,但HashSet允许放入null值,TreeSet不建议存放null值,可能会对排序结果产生影响。

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

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集合。

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<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集合。

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<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集合。

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<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的使用示例,包括导入模块、增加元素、访问元素及修改等操作,示例代码如下所示:

// HashMap
import HashMap from '@ohos.util.HashMap'; // 导入HashMap模块let hashMap1: HashMap<string, number> = new HashMap();
hashMap1.set('a', 123);
let hashMap2: HashMap<number, number> = new HashMap();
hashMap2.set(4, 123); // 增加元素
console.info(`result: ${hashMap2.hasKey(4)}`); // 判断是否含有某元素
console.info(`result: ${hashMap1.get('a')}`); // 访问元素// TreeMap
import TreeMap from '@ohos.util.TreeMap'; // 导入TreeMap模块let treeMap: TreeMap<string, number> = 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: LightWeightMap<string, number> = 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: PlainArray<string> = new PlainArray();
plainArray.add(1, 'sdd');
plainArray.add(2, 'sff'); // 增加元素
console.info(`result: ${plainArray.get(1)}`); // 访问元素
console.info(`result: ${plainArray.getKeyAt(1)}`); // 访问元素

为了能让大家更好的学习鸿蒙(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.hqwc.cn/news/589580.html

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

相关文章

TSINGSEE青犀推出河道/河湖/水域治理视频AI智能解决方案

一、方案背景 “十四五”时期&#xff0c;在面源污染防治等方面实现突破&#xff0c;实现主要水污染排放总量持续减少&#xff0c;水生态环境持续改善等任务艰巨。进一步完善流域综合治理体系&#xff0c;提升流域水环境综合治理能力和水平&#xff0c;更好适应新阶段发展需求…

电商数据API接口|抓取京东淘宝1688商品数据颜色sku信息

公共参数 API请求测试地址 名称类型必须描述keyString是调用key&#xff08;必须以GET方式拼接在URL中&#xff09;secretString是调用密钥api_nameString是API接口名称&#xff08;包括在请求地址中&#xff09;[item_search,item_get,item_search_shop等]cacheString否[yes…

蓝桥杯备考

目录 P8823 [传智杯 #3 初赛] 期末考试成绩 题目描述 输入格式 输出格式 输入输出样例 说明/提示 代码 P8828 [传智杯 #3 练习赛] 直角三角形 题目描述 输入格式 输出格式 输入输出样例 代码 P8833 [传智杯 #3 决赛] 课程 题目背景 题目描述 输入格式 输出格式…

Springboot传参要求

传参的参数名称必须与Set方法的参数名字相同 &#xff0c;不然会报错。

阿里云数据库服务器价格表查询,一键查询报价

阿里云数据库服务器价格表&#xff0c;优惠99元一年起&#xff0c;ECS云服务器2核2G、3M固定带宽、40G ESSD Entry云盘&#xff0c;优惠价格99元一年&#xff1b;阿里云数据库MySQL版2核2G基础系列经济版99元1年、2核4GB 227.99元1年&#xff0c;云数据库PostgreSQL、SQL Serve…

总结24个Python接单赚钱的平台,兼职月入5000+

一、Python兼职种类&#xff1a; 接私活刚学会python那会&#xff0c;就有认识的朋友介绍做一个网站的私活&#xff0c;当时接单赚了4K&#xff0c;后又自己接过开发网站后台接口、做数据处理等事情&#xff0c;都赚了一些。 接私活指的是利用自己的技术&#xff0c;在业余时…

笔记: JavaSE day15 笔记

第十五天课堂笔记 数组 可变长参数★★★ 方法 : 返回值类型 方法名(参数类型 参数名 , 参数类型 … 可变长参数名){}方法体 : 变长参数 相当于一个数组一个数组最多只能有一个可变长参数, 并放到列表的最后parameter : 方法参数 数组相关算法★★ 冒泡排序 由小到大: 从前…

【详解】Windows系统安装Nginx及简单使用

【详解】Windows系统安装Nginx及简单使用 一、Nginx是什么&#xff1f; “Nginx 是一款轻量级的 HTTP 服务器&#xff0c;采用事件驱动的异步非阻塞处理方式框架&#xff0c;这让其具有极好的 IO 性能&#xff0c;时常用于服务端的反向代理和负载均衡。”Nginx 是一款 http 服…

在Java中对SQL进行常规操作的通用方法

SQL通用方法 一、常规方法增删改查二、具体优化步骤1.准备工作2.getcon()方法&#xff0c;获取数据库连接对象3.closeAll()方法&#xff0c;关闭所有资源4.通用的增删改方法5.通用的查询方法6.动态查询语句 总结 一、常规方法增删改查 在常规方法中&#xff0c;我们在Java中对…

【C++第三阶段】模板类模板通用数组实现案例

以下内容仅为当前认识&#xff0c;可能有不足之处&#xff0c;欢迎讨论&#xff01; 文章目录 模板怎么使用模板函数模板注意事项普通函数与函数模板的区别普通函数与函数模板调用规则函数模板限制 类模板类模板语法类模板与函数模板区别类模板中成员函数创建时机类模板对象做函…

java运行时内存

从jdk1.7以及以后&#xff0c;静态变量和常量池存在堆空间。

蓝桥杯算法题:区间移位

题目描述 数轴上有n个闭区间&#xff1a;D1,...,Dn。 其中区间Di用一对整数[ai, bi]来描述&#xff0c;满足ai < bi。 已知这些区间的长度之和至少有10000。 所以&#xff0c;通过适当的移动这些区间&#xff0c;你总可以使得他们的“并”覆盖[0, 10000]——也就是说[0, 100…