c语言sscanf函数的用法是什么
180
2024-01-25
容器类,顾名思义就是存储的类,用于存储各种数据类型的元素,并具备一系列处理数据元素的方法在 ArkUI 开发框架中,容器类采用了类似静态的语言来实现,并通过 NAPI 框架对外提供通过对存储位置以及属性的限制,让每种类型的数据都能在完成自身功能的基础上剪除冗余分支,保证了数据的高效访问,提升了应用的性能。
本期,我们将为大家介绍 ArkUI 开发框架中容器类的各种类型以及相关 API 的使用容器类API介绍在 ArkUI 开发框架中,提供了线性和非线性两类容器类,共 14 种,每种容器都有自身的特性及使用场景。
下面,我们将为大家一一道来1.1线性容器类 线性容器类底层主要通过数组实现,包括 ArrayList、Vector、List、LinkedList、Deque、Queue、Stack 七种线性容器类 API,充分考虑了数据访问的速度,实现了运行时(Run。
time)通过一条指令就可以完成增删改查等操作1.1.1 ArrayList ArrayList 即动态数组,可用来构造全局的数组对象ArrayList 依据泛型定义,要求存储位置是一片连续的内存空间,初始容量大小为 10,并支持动态扩容,每次扩容大小为原始容量的 1.5 倍。
ArrayList 进行增、删、改、查操作的相关 API 如下:
1.1.2 Vector Vector 是指连续存储结构,可用来构造全局的数组对象Vector 依据泛型定义,要求存储位置是一片连续的内存空间,初始容量大小为 10,并支持动态扩容,每次扩容大小为原始容量的2倍。
由于 Vector 扩容速度高于 ArrayList,所以适用于数据添加比较频繁的场景Vector 在支持操作符访问的基础上,还增加了 get/set 接口,提供更为完善的校验及容错机制,满足用户不同场景下的需求。
Vector 进行增、删、改、查操作的相关 API 如下:
1.1.3 List List 可用来构造一个单向链表对象,即只能通过头结点开始访问到尾节点List 依据泛型定义,在内存中的存储位置可以是不连续的 可以通过 get/set 等接口对存储的元素进行修改,List 进行增、删、改、查操作的相关 API 如下:。
1.1.4 LinkedList LinkedList 可用来构造一个双向链表对象,可以在某一节点向前或者向后遍历 ListLinkedList 依据泛型定义,在内存中的存储位置可以是不连续的 可以通过 get/set 等接口对存储的元素进行修改,LinkedList 进行增、删、改、查操作的相关 API 如下:
1.1.5 Queue Queue 可用来构造队列对象,存储元素遵循先进先出的规则Queue 依据泛型定义,要求存储位置是一片连续的内存空间,初始容量大小为 8,并支持动态扩容,每次扩容大小为原始容量的 2 倍。
Queue 底层采用循环队列实现,入队及出队操作效率都比较高Queue 进行增、删、改、查操作的相关 API 如下:
1.1.6 Deque Deque 可用来构造双端队列对象,存储元素遵循先进先出的规则,双端队列可以分别从对头或者队尾进行访问Deque 依据泛型定义,要求存储位置是一片连续的内存空间,其初始容量大小为 8,并支持动态扩容,每次扩容大小为原始容量的 2 倍。
Deque 底层采用循环队列实现,入队及出队操作效率都比较高Deque 进行增、删、改、查操作的相关 API 如下:
1.1.7 Stack Stack 可用来构造栈对象,存储元素遵循后进先出的规则Stack 依据泛型定义,要求存储位置是一片连续的内存空间,初始容量大小为 8,并支持动态扩容,每次扩容大小为原始容量的 1.5 倍。
Stack 底层基于数组实现,入栈出栈均从数组的一端操作,Stack 进行增、删、改、查操作的相关 API 如下:
1.2非线性容器类 非线性容器类底层通过 hash 或者红黑树实现,包括 HashMap、HashSet、TreeMap、TreeSet、LightWeightMap、LightWeightSet、Pl
ainArray 七种非线性容器类中的 key 及 value 的类型均满足 ECMA 标准1.2.1 HashMap HashMap 可用来存储具有关联关系的 key-value 键值对集合,存储元素中 key 是唯一的,每个 key 会对应一个 value 值。
HashMap 依据泛型定义,集合中通过 key 的 hash 值确定其存储位置,从而快速找到键值对HashMap 的初始容量大小为 16,并支持动态扩容,每次扩容大小为原始容量的 2 倍HashMap 底层基于 HashTable 实现,冲突策略采用链地址法。
HashMap 进行增、删、改、查操作的相关 API 如下:
1.2.2 HashSet HashSet 可用来存储一系列值的集合,存储元素中 value 是唯一的依据泛型定义集合中通过 value 的 hash 值确定其存储位置,从而快速找到该值HashSet 初始容量大小为 16,支持动态扩容,每次扩容大小为原始容量的 2 倍。
value 的类型满足 ECMA 标准中要求的类型HashSet 底层基于 HashTable 实现,冲突策略采用链地址法HashSet 进行增、删、改、查操作的相关 API 如下:
1.2.3 TreeMap TreeMap 可用来存储具有关联关系的 key-value 键值对集合,存储元素中 key 是唯一的,每个 key 会对应一个 value 值TreeMap 依据泛型定义,集合中的 key 值是有序的,TreeMap 的底层是一棵二叉树,可以通过树的二叉查找快速地找到键值对。
key 的类型满足 ECMA 标准中要求的类型TreeMap 中的键值是有序存储的TreeMap 底层基于红黑树实现,可以进行快速地插入和删除TreeMap 进行增、删、改、查操作的相关 API 如下:。
1.2.4 TreeSet TreeSet 可用来存储一系列值的集合,存储元素中 value 是唯一的TreeSet 依据泛型定义,集合中的 value 值是有序的,TreeSet 的底层是一棵二叉树,可以通过树的二叉查找快速地找到该 value 值,value 的类型满足 ECMA 标准中要求的类型。
TreeSet 中的值是有序存储的TreeSet 底层基于红黑树实现,可以进行快速地插入和删除TreeSet 进行增、删、改、查操作的相关 API 如下:
1.2.5 LightWeightMap LigthWeightMap 可用来存储具有关联关系的 key-value 键值对集合,存储元素中 key 是唯一的,每个 key 会对应一个 value 值。
LigthWeightMap 依据泛型定义,采用更加轻量级的结构,集合中的 key 值的查找依赖于 hash 值以及二分查找算法,通过一个数组存储 hash 值,然后映射到其他数组中的 key 值以及 value 值,key 的类型满足 ECMA 标准中要求的类型。
初始默认容量大小为 8,每次扩容大小为原始容量的 2 倍LigthWeightMap 底层标识唯一 key 通过 hash 实现,其冲突策略为线性探测法,查找策略基于二分查找法LigthWeightMap 进行增、删、改、查操作的相关 API 如下:。
1.2.6 LightWeightSet LigthWeightSet 可用来存储一系列值的集合,存储元素中 value 是唯一的LigthWeightSet 依据泛型定义,采用更加轻量级的结构,初始默认容量大小为 8,每次扩容大小为原始容量的 2 倍。
集合中的 value 值的查找依赖于 hash 以及二分查找算法,通过一个数组存储 hash 值,然后映射到其他数组中的 value 值,value 的类型满足 ECMA 标准中要求的类型 LigthWeightSet 底层标识唯一 value 基于 hash 实现,其冲突策略为线性探测法,查找策略基于二分查找法。
LigthWeightSet 进行增、删、改、查操作的相关 API 如下:
1.2.7 PlainArray PlainArray 可用来存储具有关联关系的键值对集合,存储元素中 key 是唯一的,并且对于 PlainArray 来说,其 key 的类型为 number 类型。
每个 key 会对应一个 value 值,类型依据泛型的定义,PlainArray 采用更加轻量级的结构,集合中的 key 值的查找依赖于二分查找算法,然后映射到其他数组中的 value 值 初始默认容量大小为 16,每次扩容大小为原始容量的 2 倍。
PlainArray 的查找策略基于二分查找法PlainArray 进行增、删、改、查操作的相关 API 如下:
容器类的实现下面我们将以 ArrayList 为例,为大家介绍,容器类的实现包括容器类的初始化、容器类的接口调用、容器类对象模型的构建以及拦截器处理2.1 容器类初始化 在 ArkUI 开发框架中,通过 NAPI 的统一框架对外层提供容器类。
下面,我们将以 ArrayList 为例,介绍基于 NAPI 的容器类的加载如下图所示,是容器类初始化流程,在 NAPI 加载的过程中,会通过 ArkPrivate.Load 接口加载对应的容器类ArrayList 在引擎中会初始化 Constructor 以及 Prototype 并返回,最后应用侧可以获得该容器类并使用。
2.2 容器类接口调用 在 ArkUI 开发框架中,容器类 API 的调用流程如下,用户先通过 new ArrayList 进入引擎得到对应的 arraylist 对象,然后可以通过 add 接口向对象中添加元素,元素最终会添加到一片和该 arraylist 绑定的内存空间。
可以通过 [] 操作符进行元素获取,对于容器类而言,引擎会直接通过快速路径访问到元素存储位置,返回该值
2.3 容器类对象模型 在 ArkUI 开发框架中,构造容器类对象模型的流程如下图所示,在运行时禁止再向对象上添加 Properties 属性,ArrayList 借用对象模型中的 elements 位置存储元素。
实现说明:通过 elements 存储数组元素,Length 为数组中元素个数,数组 Capatity 可以通过 elements 的长度获取 扩容策略:ArrayList –> 1.5 倍 初始分配容量:ArrayList -> 10
(注:TS 中的实现,扩容策略及初始分配容量不感知)2.4 拦截器处理 拦截器处理,是指通过禁止掉一些影响对象行为的操作,比如 delete、setPrototype 等,在运行时(Runtime)维护一个高效的容器类对象。
以 ArrayList 为例,ArkCompiler 内部拦截的操作主要涉及 DeleteProperty、DefineProperty、GetProperty、SetPrototype、GetOwnPropertyKeys、HasProperty 等操作限制数组的 holy 添加,以及更改属性的 attributes 等操作,保证了不需要做 JSArray 必须做的 holy 判断、writable 判断等操作。
容器类API的使用通过上文的介绍,相信大家对容器类已经有了比较深刻的认识那么,我们怎么使用容器类 API 呢?本文列举常用的典型容器的使用示例,包括导入模块、增加元素、访问元素及修改等操作:复制// ArrayList。
复制import ArrayList from @ohos.util.ArrayList // 导入ArrayList模块复制let arrayList = new ArrayList();复制arrayList.add(
"a");复制arrayList.add(1); // 增加元素复制print(arrayList[0]); // 访问元素复制arrayList[0] = one"; // 修改元素复制print(arrayList[0]);
复制// Vector复制import Vector from @ohos.util.Vector // 导入Vector模块复制let vector = new Vector();复制vector.add("
a");复制let b = [1, 2, 3];复制vector.add(b);复制vector.add(false); // 增加元素复制print(vector[0]); // 访问元素复制print(vector.getFi
rstElement()); // 访问元素复制// Deque复制import Deque from @ohos.util.Deque // 导入Deque模块复制let deque = new Deque;
复制deque.insertFront("a");复制deque.insertFront(1); // 增加元素复制print(deque[0]); // 访问元素复制deque[0] = "
one"; // 修改元素复制print(deque[0]);复制// Stack复制import Stack from @ohos.util.Stack // 导入Stack模块 复制let stack = new Stack();
复制stack.push("a");复制stack.push(1); // 增加元素复制print(stack[0]); // 访问元素复制stack.pop(); // 弹出元素复制print(stack.length);
复制// List复制import List from @ohos.util.List // 导入List模块复制let list = new List;复制list.add("a");复制list.add(1);
复制let b = [1, 2, 3];复制list.add(b); // 增加元素复制print(list[0]); // 访问元素复制print(list.get(0)); // 访问元素
复制// HashMap复制import HashMap from @ohos.util.HashMap // 导入HashMap模块复制let hashMap = new HashMap();复制
hashMap.set("a", 123);复制hashMap.set(4, 123); // 增加元素复制print(hashMap.hasKey(4)); // 判断是否含有某元素复制print(hashMap.get("
a")); // 访问元素复制// TreeMap复制import TreeMap from @ohos.util.TreeMap // 导入TreeMap模块复制let treeMap = new TreeMap();
复制treeMap.set("a", 123);复制treeMap.set("6", 356); // 增加元素复制print(treeMap.get("a")); // 访问元素
复制print(treeMap.getFirstKey("a")); // 访问首元素复制print(treeMap.getLastKey("a")); // 访问尾元素复制// LightWeightMap
复制import LightWeightMap from @ohos.util.LightWeightMap // 导入LightWeightMap模块复制let lightWeightMap = new LightWeightMap();
复制lightWeightMap.set("x", 123);复制lightWeightMap.set("8", 356); // 增加元素复制print(lightWeightMap.get("a
")); // 访问元素复制print(lightWeightMap.get("x")); // 访问元素复制print(lightWeightMap.getIndexOfKey("8")); // 访问元素
复制// PlainArray复制import PlainArray from @ohos.util.PlainArray // 导入PlainArray模块复制let plainArray = new PlainArray();
复制plainArray.add(1, "sdd");复制plainArray.add(2, "sff"); // 增加元素复制print(plainArray.get(1)); // 访问元素
复制print(plainArray.getKeyAt(1));//访问元素 至此以上就是本期全部内容,期待广大开发者通过 ArkUI 开发框架的容器类开发出更多高性能的应用 审核编辑 :李倩
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~