一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

鴻蒙開發(fā)學(xué)習(xí):【方舟開發(fā)框架容器類API的介紹與使用】

jf_46214456 ? 來源:jf_46214456 ? 作者:jf_46214456 ? 2024-05-13 16:45 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

一、容器類API介紹

方舟開發(fā)框架中,提供了線性非線性兩類容器類,共14種,每種容器都有自身的特性及使用場景。下面,我們將為大家一一道來。

鴻蒙開發(fā)指導(dǎo)文檔:[gitee.com/li-shizhen-skin/harmony-os/blob/master/README.md]

線性容器類

線性容器類底層主要通過數(shù)組實現(xiàn),包括ArrayList、Vector、List、LinkedList、Deque、Queue、Stack七種。線性容器類API,充分考慮了數(shù)據(jù)訪問的速度,運行時(Runtime)通過一條字節(jié)碼指令就可以完成增刪改查等操作。

1. ArrayList

ArrayList即動態(tài)數(shù)組,可用來構(gòu)造全局的數(shù)組對象。ArrayList依據(jù)泛型定義,要求存儲位置是一片連續(xù)的內(nèi)存空間,初始容量大小為10,并支持動態(tài)擴容,每次擴容大小為原始容量的1.5倍。ArrayList進行增、刪、改、查操作的相關(guān)API如下:

image.png

2. Vector

Vector 是指連續(xù)存儲結(jié)構(gòu),可用來構(gòu)造全局的數(shù)組對象。Vector依據(jù)泛型定義,要求存儲位置是一片連續(xù)的內(nèi)存空間,初始容量大小為10,并支持動態(tài)擴容,每次擴容大小為原始容量的2倍。

由于Vector擴容速度高于ArrayList,所以適用于數(shù)據(jù)添加比較頻繁的場景。Vector在支持操作符訪問的基礎(chǔ)上,還增加了get/set接口,提供更為完善的校驗及容錯機制,滿足用戶不同場景下的需求。Vector進行增、刪、改、查操作的相關(guān)API如下:

image.png

3. List

List可用來構(gòu)造一個單向鏈表對象,即只能通過頭結(jié)點開始訪問到尾節(jié)點。List依據(jù)泛型定義,在內(nèi)存中的存儲位置可以是不連續(xù)的。

可以通過get/set等接口對存儲的元素進行修改,List進行增、刪、改、查操作的相關(guān)API如下:
image.png

4. LinkedList

LinkedList可用來構(gòu)造一個雙向鏈表對象,可以在某一節(jié)點向前或者向后遍歷List。LinkedList依據(jù)泛型定義,在內(nèi)存中的存儲位置可以是不連續(xù)的。

可以通過get/set等接口對存儲的元素進行修改,LinkedList進行增、刪、改、查操作的相關(guān)API如下:

image.png

5. Queue

Queue可用來構(gòu)造隊列對象,存儲元素遵循先進先出的規(guī)則。Queue依據(jù)泛型定義,要求存儲位置是一片連續(xù)的內(nèi)存空間,初始容量大小為8,并支持動態(tài)擴容,每次擴容大小為原始容量的2倍。Queue底層采用循環(huán)隊列實現(xiàn),入隊及出隊操作效率都比較高。Queue進行增、刪、改、查操作的相關(guān)API如下:

image.png

6. Deque

Deque可用來構(gòu)造雙端隊列對象,存儲元素遵循先進先出的規(guī)則,雙端隊列可以分別從對頭或者隊尾進行訪問。Deque依據(jù)泛型定義,要求存儲位置是一片連續(xù)的內(nèi)存空間,其初始容量大小為8,并支持動態(tài)擴容,每次擴容大小為原始容量的2倍。Deque底層采用循環(huán)隊列實現(xiàn),入隊及出隊操作效率都比較高。Deque進行增、刪、改、查操作的相關(guān)API如下:

image.png

7. Stack

Stack可用來構(gòu)造棧對象,存儲元素遵循后進先出的規(guī)則。Stack依據(jù)泛型定義,要求存儲位置是一片連續(xù)的內(nèi)存空間,初始容量大小為8,并支持動態(tài)擴容,每次擴容大小為原始容量的1.5倍。Stack底層基于數(shù)組實現(xiàn),入棧出棧均從數(shù)組的一端操作,Stack進行增、刪、改、查操作的相關(guān)API如下:image.png

非線性容器類

非線性容器類底層通過hash或者紅黑樹實現(xiàn),包括HashMap、HashSet、TreeMap、TreeSet、LightWeightMap、LightWeightSet、PlainArray七種。非線性容器類中的key及value的類型均滿足ECMA標(biāo)準(zhǔn)。

1. HashMap

HashMap可用來存儲具有關(guān)聯(lián)關(guān)系的key-value鍵值對集合,存儲元素中key是唯一的,每個key會對應(yīng)一個value值。HashMap依據(jù)泛型定義,集合中通過key的hash值確定其存儲位置,從而快速找到鍵值對。HashMap的初始容量大小為16,并支持動態(tài)擴容,每次擴容大小為原始容量的2倍。HashMap底層基于HashTable實現(xiàn),沖突策略采用鏈地址法。HashMap進行增、刪、改、查操作的相關(guān)API如下:image.png

2. HashSet

HashSet可用來存儲一系列值的集合,存儲元素中value是唯一的。依據(jù)泛型定義。集合中通過value的hash值確定其存儲位置,從而快速找到該值。HashSet初始容量大小為16,支持動態(tài)擴容,每次擴容大小為原始容量的2倍。value的類型滿足ECMA標(biāo)準(zhǔn)中要求的類型。HashSet底層基于HashTable實現(xiàn),沖突策略采用鏈地址法。HashSet進行增、刪、改、查操作的相關(guān)API如下:

image.png

3. TreeMap

TreeMap可用來存儲具有關(guān)聯(lián)關(guān)系的key-value鍵值對集合,存儲元素中key是唯一的,每個key會對應(yīng)一個value值。TreeMap依據(jù)泛型定義,集合中的key值是有序的,TreeMap的底層是一棵二叉樹,可以通過樹的二叉查找快速的找到鍵值對。key的類型滿足ECMA標(biāo)準(zhǔn)中要求的類型。TreeMap中的鍵值是有序存儲的。TreeMap底層基于紅黑樹實現(xiàn),可以進行快速的插入和刪除。TreeMap進行增、刪、改、查操作的相關(guān)API如下:

image.png

4. TreeSet

TreeSet可用來存儲一系列值的集合,存儲元素中value是唯一的。TreeSet依據(jù)泛型定義,集合中的value值是有序的,TreeSet的底層是一棵二叉樹,可以通過樹的二叉查找快速的找到該value值,value的類型滿足ECMA標(biāo)準(zhǔn)中要求的類型。TreeSet中的值是有序存儲的。TreeSet底層基于紅黑樹實現(xiàn),可以進行快速的插入和刪除。TreeSet進行增、刪、改、查操作的相關(guān)API如下:

image.png

5. LightWeightMap

LigthWeightMap可用來存儲具有關(guān)聯(lián)關(guān)系的key-value鍵值對集合,存儲元素中key是唯一的,每個key會對應(yīng)一個value值。LigthWeightMap依據(jù)泛型定義,采用更加輕量級的結(jié)構(gòu),集合中的key值的查找依賴于hash值以及二分查找算法,通過一個數(shù)組存儲hash值,然后映射到其他數(shù)組中的key值以及value值,key的類型滿足ECMA標(biāo)準(zhǔn)中要求的類型。

初始默認(rèn)容量大小為8,每次擴容大小為原始容量的2倍。LigthWeightMap底層標(biāo)識唯一key通過hash實現(xiàn),其沖突策略為線性探測法,查找策略基于二分查找法。LigthWeightMap進行增、刪、改、查操作的相關(guān)API如下:

image.png

6. LightWeightSet

LigthWeightSet可用來存儲一系列值的集合,存儲元素中value是唯一的。LigthWeightSet依據(jù)泛型定義,采用更加輕量級的結(jié)構(gòu),初始默認(rèn)容量大小為8,每次擴容大小為原始容量的2倍。集合中的value值的查找依賴于hash以及二分查找算法,通過一個數(shù)組存儲hash值,然后映射到其他數(shù)組中的value值,value的類型滿足ECMA標(biāo)準(zhǔn)中要求的類型。

LigthWeightSet底層標(biāo)識唯一value基于hash實現(xiàn),其沖突策略為線性探測法,查找策略基于二分查找法。LigthWeightSet進行增、刪、改、查操作的相關(guān)API如下:

image.png

7. PlainArray

PlainArray可用來存儲具有關(guān)聯(lián)關(guān)系的鍵值對集合,存儲元素中key是唯一的,并且對于PlainArray來說,其key的類型為number類型。每個key會對應(yīng)一個value值,類型依據(jù)泛型的定義,PlainArray采用更加輕量級的結(jié)構(gòu),集合中的key值的查找依賴于二分查找算法,然后映射到其他數(shù)組中的value值。

初始默認(rèn)容量大小為16,每次擴容大小為原始容量的2倍。PlainArray的查找策略基于二分查找法。PlainArray進行增、刪、改、查操作的相關(guān)API如下:

image.png

二、容器類的實現(xiàn)

下面我們將以ArrayList為例,為大家介紹,容器類的實現(xiàn)。包括容器類的初始化、容器類的接口調(diào)用、容器類對象模型的構(gòu)建以及攔截器處理。

容器類初始化

在方舟開發(fā)框架中,通過NAPI的統(tǒng)一框架對外層提供容器類。下面,我們將以ArrayList為例,介紹基于NAPI的容器類的加載。如下圖所示,是容器類初始化流程,在NAPI加載的過程中,會通過ArkPrivate.Load接口加載對應(yīng)的容器類。ArrayList在引擎中會初始化Constructor以及Prototype并返回,最后應(yīng)用側(cè)可以獲得該容器類并使用。

image.png

圖1 容器類初始化流程

容器類接口調(diào)用

在方舟開發(fā)框架中,容器類API的調(diào)用流程如圖2所示,用戶先通過new ArrayList進入引擎得到對應(yīng)的arraylist對象,然后可以通過add接口向?qū)ο笾刑砑釉?,元素最終會添加到一片和該arraylist綁定的內(nèi)存空間。可以通過[]操作符進行元素獲取,對于容器類而言,引擎會直接通過快速路徑訪問到元素存儲位置,返回該值。

image.png

圖2 容器類API的調(diào)用流程

容器類對象模型

在方舟開發(fā)框架中,構(gòu)造容器類對象模型的流程如下圖所示,在運行時禁止再向?qū)ο笊咸砑覲roperties屬性,ArrayList借用對象模型中的elements位置存儲元素。

image.png

圖3 容器類對象模型的構(gòu)造流程

實現(xiàn)說明:通過elements存儲數(shù)組元素,Length為數(shù)組中元素個數(shù),數(shù)組Capatity可以通過elements的長度獲取。

擴容策略:ArrayList –> 1.5倍

初始分配容量:ArrayList -> 10

(注:TS中的實現(xiàn),擴容策略及初始分配容量不感知)

攔截器處理

攔截器處理,是指通過禁止掉一些影響對象行為的操作,比如delete、setPrototype等,在運行時(Runtime)維護一個高效的容器類對象。如圖4所示,以ArrayList為例,ArkCompiler內(nèi)部攔截的操作主要涉及DeleteProperty、DefineProperty、GetProperty、SetPrototype、GetOwnPropertyKeys、HasProperty等操作限制數(shù)組的holy添加,以及更改屬性的attributes等操作,保證了不需要做JSArray必須做的holy 判斷、writable 判斷等操作。

image.png

圖4 攔截器處理

HarmonyOSOpenHarmony鴻蒙文檔籽料:mau123789是v直接拿

搜狗高速瀏覽器截圖20240326151450.png
三、容器類API的使用

通過上文的介紹,相信大家對容器類已經(jīng)有了比較深刻的認(rèn)識。那么,我們怎么使用容器類API呢?本文列舉常用的典型容器的使用示例,包括導(dǎo)入模塊、增加元素、訪問元素及修改等操作:

// ArrayList  
import ArrayList from '@ohos.util.ArrayList' // 導(dǎo)入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' // 導(dǎo)入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()); // 訪問元素

// Deque  
import Deque from '@ohos.util.Deque' // 導(dǎo)入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' // 導(dǎo)入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' // 導(dǎo)入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' // 導(dǎo)入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' // 導(dǎo)入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' // 導(dǎo)入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' // 導(dǎo)入PlainArray模塊  
let plainArray = new PlainArray();  
plainArray.add(1, "sdd");  
plainArray.add(2, "sff"); // 增加元素  
print(plainArray.get(1)); // 訪問元素  
print(plainArray.getKeyAt(1)); // 訪問元素

審核編輯 黃宇

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • API
    API
    +關(guān)注

    關(guān)注

    2

    文章

    1620

    瀏覽量

    64059
  • 鴻蒙
    +關(guān)注

    關(guān)注

    60

    文章

    2620

    瀏覽量

    44063
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點推薦

    鴻蒙開發(fā):【OpenHarmony 4.0 Release指導(dǎo)】

    OpenHarmony 4.0版本如期而至,開發(fā)套件同步升級到API 10。相比3.2 Release版本,新增4000多個API,應(yīng)用開發(fā)能力更加豐富;HDF新增200多個HDI接口
    的頭像 發(fā)表于 05-14 09:59 ?2481次閱讀
    <b class='flag-5'>鴻蒙</b><b class='flag-5'>開發(fā)</b>:【OpenHarmony 4.0 Release指導(dǎo)】

    鴻蒙開發(fā)API9 到 API12,有哪些不同

    ? ##HarmonyOS 應(yīng)用開發(fā)## 雖然API9已經(jīng)屬于過時了,但是現(xiàn)在很多學(xué)校里教的還是基于API9的鴻蒙開發(fā),當(dāng)學(xué)生需要在畢業(yè)設(shè)計
    發(fā)表于 06-29 22:47

    HarmonyOS應(yīng)用開發(fā)-JS相關(guān)整體梳理

    方舟開發(fā)框架是一種跨設(shè)備的高性能UI開發(fā)框架,支持聲明式編程和跨設(shè)備多態(tài)UI?;A(chǔ)能力Web范
    發(fā)表于 11-29 10:44

    HarmonyOS方舟開發(fā)框架容器API介紹與使用

    API的使用。 一、容器API介紹方舟開發(fā)
    發(fā)表于 03-07 11:40

    OpenHarmony 3.1 Beta版本關(guān)鍵特性解析——ArkUI容器API介紹

    ,我們將為大家介紹 ArkUI 開發(fā)框架容器的各種類型以及相關(guān) API 的使用。一、
    發(fā)表于 04-24 14:58

    HarmonyOS/OpenHarmony應(yīng)用開發(fā)-Web開發(fā)范式

    兼容JS的Web開發(fā)范式的方舟開發(fā)框架,采用經(jīng)典的HML、CSS、JavaScript三段式開發(fā)
    發(fā)表于 01-18 19:15

    OpenHarmony應(yīng)用開發(fā)-ArkUI方舟開發(fā)框架簡析

    ,方舟開發(fā)框架提供了兩種開發(fā)范式,分別是基于ArkTS的聲明式開發(fā)范式(簡稱“聲明式開發(fā)范式”)
    發(fā)表于 04-23 09:35

    OpenHarmony 應(yīng)用開發(fā)SDK、API 與基礎(chǔ)工具

    類似于 ArkTS API 上的完整鴻蒙平臺能力,開發(fā)者可以使用 C API 開發(fā)支持鴻蒙應(yīng)用
    發(fā)表于 09-19 15:45

    要成為鴻蒙開發(fā)者,應(yīng)該學(xué)習(xí)哪些編程語言

    據(jù)了解,鴻蒙系統(tǒng)是基于Linux開發(fā)的,源碼是C語言。那么,作為一名開發(fā)者,如何幫助鴻蒙系統(tǒng)構(gòu)建生態(tài)呢?在以往安卓、蘋果系統(tǒng)構(gòu)建過程,有哪些可以值得借鑒的地方呢?要成為
    的頭像 發(fā)表于 09-24 12:06 ?1.3w次閱讀

    華為開發(fā)者大會2021_方舟開發(fā)有效提升開發(fā)效率

    華為開發(fā)者大會2021中,重點闡述了方舟開發(fā)框架,此框架有效的提升開發(fā)效率。
    的頭像 發(fā)表于 10-22 15:17 ?1586次閱讀
    華為<b class='flag-5'>開發(fā)</b>者大會2021_<b class='flag-5'>方舟</b><b class='flag-5'>開發(fā)</b>有效提升<b class='flag-5'>開發(fā)</b>效率

    方舟開發(fā)框架(Ark UI)概述及開發(fā)實戰(zhàn)

    本期要為大家介紹的是ArkUI入門課程——HarmonyOS技術(shù)訓(xùn)練營第四期《方舟開發(fā)框架(Ark UI)概述及開發(fā)實戰(zhàn)》。相信
    的頭像 發(fā)表于 12-17 14:49 ?8768次閱讀

    方舟開發(fā)框架容器的各種類型

    屬性的限制,讓每種類型的數(shù)據(jù)都能在完成自身功能的基礎(chǔ)上剪除冗余分支,保證了數(shù)據(jù)的高效訪問,提升了應(yīng)用的性能。本期,我們將為大家介紹方舟開發(fā)框架容器
    的頭像 發(fā)表于 03-14 13:45 ?1941次閱讀
    <b class='flag-5'>方舟</b><b class='flag-5'>開發(fā)</b><b class='flag-5'>框架</b>中<b class='flag-5'>容器</b><b class='flag-5'>類</b>的各種類型

    OpenHarmony 3.1 Beta版本關(guān)鍵特性解析——ArkUI開發(fā)框架容器API介紹與使用

    線性容器底層主要通過數(shù)組實現(xiàn),包括 ArrayList、Vector、List、LinkedList、Deque、Queue、Stack 七種。線性容器
    的頭像 發(fā)表于 03-17 10:48 ?1049次閱讀

    鴻蒙開發(fā)用什么語言?

    兩種開發(fā)方向 我們常說鴻蒙開發(fā),但是其實鴻蒙開發(fā)分為兩個方向: 一個是系統(tǒng)級別的開發(fā),比如驅(qū)動,
    的頭像 發(fā)表于 01-30 16:12 ?2212次閱讀
    <b class='flag-5'>鴻蒙</b><b class='flag-5'>開發(fā)</b>用什么語言?

    鴻蒙ArkUI-X框架開發(fā):【開發(fā)準(zhǔn)備】

    本文檔適用于ArkUI-X框架開發(fā)的初學(xué)者。通過環(huán)境搭建、代碼下載、代碼編譯、API擴展和使用,快速了解跨平臺項目開發(fā)流程。
    的頭像 發(fā)表于 05-23 21:02 ?809次閱讀
    <b class='flag-5'>鴻蒙</b>ArkUI-X<b class='flag-5'>框架開發(fā)</b>:【<b class='flag-5'>開發(fā)</b>準(zhǔn)備】