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

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

3天内不再提示

方舟开发框架中容器类的各种类型

电子发烧友开源社区 来源:HarmonyOS官方合作社区 作者:HarmonyOS官方合作社 2022-03-14 13:45 次阅读

作者:liuxin,华为高级工程师

容器类,顾名思义就是存储的类,用于存储各种数据类型的元素,并具备一系列处理数据元素的方法。在方舟开发框架中,容器类采用了类似静态语言的方式来实现,并通过NAPI框架对外提供。通过对存储位置以及属性的限制,让每种类型的数据都能在完成自身功能的基础上剪除冗余分支,保证了数据的高效访问,提升了应用的性能。本期,我们将为大家介绍方舟开发框架中容器类的各种类型以及相关API的使用。

一、容器类API介绍

在方舟开发框架中,提供了线性和非线性两类容器类,共14种,每种容器都有自身的特性及使用场景。下面,我们将为大家一一道来。

1线性容器类

线性容器类底层主要通过数组实现,包括ArrayList、Vector、List、LinkedList、Deque、Queue、Stack七种。线性容器类API,充分考虑了数据访问的速度,运行时(Runtime)通过一条字节码指令就可以完成增删改查等操作。

1. ArrayList

ArrayList即动态数组,可用来构造全局的数组对象。ArrayList依据泛型定义,要求存储位置是一片连续的内存空间,初始容量大小为10,并支持动态扩容,每次扩容大小为原始容量的1.5倍。ArrayList进行增、删、改、查操作的相关API如下:

方舟开发框架中容器类的各种类型

2. Vector

Vector 是指连续存储结构,可用来构造全局的数组对象。Vector依据泛型定义,要求存储位置是一片连续的内存空间,初始容量大小为10,并支持动态扩容,每次扩容大小为原始容量的2倍。

由于Vector扩容速度高于ArrayList,所以适用于数据添加比较频繁的场景。Vector在支持操作符访问的基础上,还增加了get/set接口,提供更为完善的校验及容错机制,满足用户不同场景下的需求。Vector进行增、删、改、查操作的相关API如下:

方舟开发框架中容器类的各种类型

3. List

List可用来构造一个单向链表对象,即只能通过头结点开始访问到尾节点。List依据泛型定义,在内存中的存储位置可以是不连续的。

可以通过get/set等接口对存储的元素进行修改,List进行增、删、改、查操作的相关API如下:

方舟开发框架中容器类的各种类型

4. LinkedList

LinkedList可用来构造一个双向链表对象,可以在某一节点向前或者向后遍历List。LinkedList依据泛型定义,在内存中的存储位置可以是不连续的。

可以通过get/set等接口对存储的元素进行修改,LinkedList进行增、删、改、查操作的相关API如下:

方舟开发框架中容器类的各种类型

5. Queue

Queue可用来构造队列对象,存储元素遵循先进先出的规则。Queue依据泛型定义,要求存储位置是一片连续的内存空间,初始容量大小为8,并支持动态扩容,每次扩容大小为原始容量的2倍。Queue底层采用循环队列实现,入队及出队操作效率都比较高。Queue进行增、删、改、查操作的相关API如下:

方舟开发框架中容器类的各种类型

6. Deque

Deque可用来构造双端队列对象,存储元素遵循先进先出的规则,双端队列可以分别从对头或者队尾进行访问。Deque依据泛型定义,要求存储位置是一片连续的内存空间,其初始容量大小为8,并支持动态扩容,每次扩容大小为原始容量的2倍。Deque底层采用循环队列实现,入队及出队操作效率都比较高。Deque进行增、删、改、查操作的相关API如下:

方舟开发框架中容器类的各种类型

7. Stack

Stack可用来构造栈对象,存储元素遵循后进先出的规则。Stack依据泛型定义,要求存储位置是一片连续的内存空间,初始容量大小为8,并支持动态扩容,每次扩容大小为原始容量的1.5倍。Stack底层基于数组实现,入栈出栈均从数组的一端操作,Stack进行增、删、改、查操作的相关API如下:

方舟开发框架中容器类的各种类型

2非线性容器类

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

1. HashMap

HashMap可用来存储具有关联关系的key-value键值对集合,存储元素中key是唯一的,每个key会对应一个value值。HashMap依据泛型定义,集合中通过key的hash值确定其存储位置,从而快速找到键值对。HashMap的初始容量大小为16,并支持动态扩容,每次扩容大小为原始容量的2倍。HashMap底层基于HashTable实现,冲突策略采用链地址法。HashMap进行增、删、改、查操作的相关API如下:

方舟开发框架中容器类的各种类型

2. HashSet

HashSet可用来存储一系列值的集合,存储元素中value是唯一的。依据泛型定义。集合中通过value的hash值确定其存储位置,从而快速找到该值。HashSet初始容量大小为16,支持动态扩容,每次扩容大小为原始容量的2倍。value的类型满足ECMA标准中要求的类型。HashSet底层基于HashTable实现,冲突策略采用链地址法。HashSet进行增、删、改、查操作的相关API如下:

方舟开发框架中容器类的各种类型

3. TreeMap

TreeMap可用来存储具有关联关系的key-value键值对集合,存储元素中key是唯一的,每个key会对应一个value值。TreeMap依据泛型定义,集合中的key值是有序的,TreeMap的底层是一棵二叉树,可以通过树的二叉查找快速的找到键值对。key的类型满足ECMA标准中要求的类型。TreeMap中的键值是有序存储的。TreeMap底层基于红黑树实现,可以进行快速的插入和删除。TreeMap进行增、删、改、查操作的相关API如下:

方舟开发框架中容器类的各种类型

4. TreeSet

TreeSet可用来存储一系列值的集合,存储元素中value是唯一的。TreeSet依据泛型定义,集合中的value值是有序的,TreeSet的底层是一棵二叉树,可以通过树的二叉查找快速的找到该value值,value的类型满足ECMA标准中要求的类型。TreeSet中的值是有序存储的。TreeSet底层基于红黑树实现,可以进行快速的插入和删除。TreeSet进行增、删、改、查操作的相关API如下:

方舟开发框架中容器类的各种类型

5. LightWeightMap

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

初始默认容量大小为8,每次扩容大小为原始容量的2倍。LigthWeightMap底层标识唯一key通过hash实现,其冲突策略为线性探测法,查找策略基于二分查找法。LigthWeightMap进行增、删、改、查操作的相关API如下:

方舟开发框架中容器类的各种类型

6. LightWeightSet

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

LigthWeightSet底层标识唯一value基于hash实现,其冲突策略为线性探测法,查找策略基于二分查找法。LigthWeightSet进行增、删、改、查操作的相关API如下:

方舟开发框架中容器类的各种类型

7. PlainArray

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

初始默认容量大小为16,每次扩容大小为原始容量的2倍。PlainArray的查找策略基于二分查找法。PlainArray进行增、删、改、查操作的相关API如下:

方舟开发框架中容器类的各种类型

二、容器类的实现

下面我们将以ArrayList为例,为大家介绍,容器类的实现。包括容器类的初始化、容器类的接口调用、容器类对象模型的构建以及拦截器处理。

1容器类初始化

在方舟开发框架中,通过NAPI的统一框架对外层提供容器类。下面,我们将以ArrayList为例,介绍基于NAPI的容器类的加载。如下图所示,是容器类初始化流程,在NAPI加载的过程中,会通过ArkPrivate.Load接口加载对应的容器类。ArrayList在引擎中会初始化Constructor以及Prototype并返回,最后应用侧可以获得该容器类并使用。

方舟开发框架中容器类的各种类型

图1 容器类初始化流程

2容器类接口调用

在方舟开发框架中,容器类API的调用流程如图2所示,用户先通过new ArrayList进入引擎得到对应的arraylist对象,然后可以通过add接口向对象中添加元素,元素最终会添加到一片和该arraylist绑定的内存空间。可以通过[]操作符进行元素获取,对于容器类而言,引擎会直接通过快速路径访问到元素存储位置,返回该值。

方舟开发框架中容器类的各种类型

图2 容器类API的调用流程

3容器类对象模型

在方舟开发框架中,构造容器类对象模型的流程如下图所示,在运行时禁止再向对象上添加Properties属性,ArrayList借用对象模型中的elements位置存储元素。

方舟开发框架中容器类的各种类型

图3 容器类对象模型的构造流程

实现说明:通过elements存储数组元素,Length为数组中元素个数,数组Capatity可以通过elements的长度获取。

扩容策略:ArrayList –> 1.5倍

初始分配容量:ArrayList -> 10

(注:TS中的实现,扩容策略及初始分配容量不感知)

4拦截器处理

拦截器处理,是指通过禁止掉一些影响对象行为的操作,比如delete、setPrototype等,在运行时(Runtime)维护一个高效的容器类对象。如图4所示,以ArrayList为例,ArkCompiler内部拦截的操作主要涉及DeleteProperty、DefineProperty、GetProperty、SetPrototype、GetOwnPropertyKeys、HasProperty等操作限制数组的holy添加,以及更改属性的attributes等操作,保证了不需要做JSArray必须做的holy 判断、writable 判断等操作。

方舟开发框架中容器类的各种类型

图4 拦截器处理

三、容器类API的使用

通过上文的介绍,相信大家对容器类已经有了比较深刻的认识。那么,我们怎么使用容器类API呢?本文列举常用的典型容器的使用示例,包括导入模块、增加元素、访问元素及修改等操作:

// ArrayListimport 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]);

// Vectorimport 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.getFirstElement()); // 访问元素

// Dequeimport 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]);

// Stackimport Stack from '@ohos.util.Stack'  // 导入Stack模块  let stack = new Stack();stack.push("a");stack.push(1);   // 增加元素print(stack[0]); // 访问元素stack.pop();     // 弹出元素print(stack.length);

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

// HashMapimport 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"));  // 访问元素

// TreeMapimport 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"));  // 访问尾元素

// LightWeightMapimport 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")); // 访问元素

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

(左右滑动,查看更多)

至此以上就是本期全部内容,期待广大开发者通过方舟开发框架的容器类开发出更多高性能的应用。

原文标题:HarmonyOS 方舟开发框架容器类API的介绍与使用

文章出处:【微信公众号:HarmonyOS官方合作社区】欢迎添加关注!文章转载请注明出处。

审核编辑:汤梓红


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

    关注

    12

    文章

    3862

    浏览量

    84674
  • 容器
    +关注

    关注

    0

    文章

    481

    浏览量

    21884
  • HarmonyOS
    +关注

    关注

    79

    文章

    1856

    浏览量

    29267

原文标题:HarmonyOS 方舟开发框架容器类API的介绍与使用

文章出处:【微信号:HarmonyOS_Community,微信公众号:电子发烧友开源社区】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    主板的各种类型信号的基本走线要求

    主板的各种类型信号的基本走线要求。
    发表于 08-07 21:14

    电感元件的各种类型及其常见用法讨论

    ,还可以用作RF扼流圈。  选择在设计中使用RF电感的电子工程师有多种选择。为了简化这种选择,本文将讨论电感元件的各种类型及其常见用法。
    发表于 06-26 08:18

    请问各种类型的放大器在性能与电路都有什么区别呢?

    各种类型的放大器在性能与电路都有什么区别呢?
    发表于 04-22 07:00

    如何辨别各种类型的接口

    【IT168 应用】电源的功率一直是玩家们关注的焦点,可对于刚涉足DIY领域的用户来说,自己组装DIY一台电脑拿才是最令人兴奋的事情。组装电脑少不了要接各种各样的线材,那么如何辨别各种类型的接口
    发表于 11-11 07:46

    HarmonyOS方舟开发框架容器API的介绍与使用

    对外提供。通过对存储位置以及属性的限制,让每种类型的数据都能在完成自身功能的基础上剪除冗余分支,保证了数据的高效访问,提升了应用的性能。 本期,我们将为大家介绍方舟开发框架
    发表于 03-07 11:40

    OpenHarmony应用开发-ArkUI方舟开发框架简析

    方舟开发框架提供了两种开发范式,分别是基于ArkTS的声明式开发范式(简称“声明式开发范式”)
    发表于 04-23 09:35

    各种类型容器的比较

    各种类型容器的比较 频率的特性
    发表于 02-10 11:49 955次阅读
    <b class='flag-5'>各种类型</b>电<b class='flag-5'>容器</b>的比较

    主板的各种类型信号的基本走线要求

    主板的各种类型信号的基本走线要求         首先在做图之前应对一些重要信号进行Space设置和一些线宽设置,如
    发表于 03-20 13:57 1589次阅读

    各种类型变压器、电抗器的认识及外形图

    各种类型变压器、电抗器的认识及外形图 100VA三相干式变压器
    发表于 04-26 11:55 3398次阅读

    USB各种类型接口的引脚定义

    USB各种类型接口,包括USB、Mini-USB、Micro-USB的介绍
    发表于 11-30 11:40 0次下载

    C51各种类型的大小

    目录各种类型所占空间(字节为单位)各类型大小各种类型所占空间(字节为单位)unsigned char is 1signed char is 1unsigned int is 2signed int
    发表于 01-13 15:27 0次下载
    C51<b class='flag-5'>各种类型</b>的大小

    如何选择各种类型逆变器电路中的MOS管

    逆变器适用范围非常广泛,比如说光伏逆变器、车载逆变器、储能逆变器等等方面。这些类型应用都已经遍布在我们的生活中,究竟如何选择能够用于光伏、车载、储能等各种类型逆变器电路中的MOS管呢?
    的头像 发表于 09-28 10:14 4534次阅读

    各种类型的混频器及优缺点

    在RF和微波设计中,混频是信号链最关键的部分之一。今天我们就讲讲各种类型的混频器以及各自的优缺点。
    的头像 发表于 10-19 10:26 4742次阅读

    在MCU开发中如何充分利用各种类型的断点?

    在MCU开发中如何充分利用各种类型的断点?
    的头像 发表于 09-18 16:22 383次阅读
    在MCU<b class='flag-5'>开发</b>中如何充分利用<b class='flag-5'>各种类型</b>的断点?

    浅析各种类型的光伏支架

    电子发烧友网站提供《浅析各种类型的光伏支架.doc》资料免费下载
    发表于 11-02 11:37 1次下载
    浅析<b class='flag-5'>各种类型</b>的光伏支架