精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

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官方合作社區】歡迎添加關注!文章轉載請注明出處。

審核編輯:湯梓紅


聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 存儲
    +關注

    關注

    13

    文章

    4123

    瀏覽量

    85273
  • 容器
    +關注

    關注

    0

    文章

    490

    瀏覽量

    21986
  • HarmonyOS
    +關注

    關注

    79

    文章

    1946

    瀏覽量

    29736

原文標題:HarmonyOS 方舟開發框架容器類API的介紹與使用

文章出處:【微信號:HarmonyOS_Community,微信公眾號:電子發燒友開源社區】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    鴻蒙開發學習:【方舟開發框架容器API的介紹與使用】

    在**方舟**開發框架,提供了**線性**和**非線性**兩容器
    的頭像 發表于 05-13 16:45 ?736次閱讀
    鴻蒙<b class='flag-5'>開發</b>學習:【<b class='flag-5'>方舟</b><b class='flag-5'>開發</b><b class='flag-5'>框架</b><b class='flag-5'>容器</b><b class='flag-5'>類</b>API的介紹與使用】

    主板的各種類型信號的基本走線要求

    主板的各種類型信號的基本走線要求。
    發表于 08-07 21:14

    電感元件的各種類型及其常見用法討論

    ,還可以用作RF扼流圈。  選擇在設計中使用RF電感的電子工程師有多種選擇。為了簡化這種選擇,本文將討論電感元件的各種類型及其常見用法。
    發表于 06-26 08:18

    如何辨別各種類型的接口

    【IT168 應用】電源的功率一直是玩家們關注的焦點,可對于剛涉足DIY領域的用戶來說,自己組裝DIY一臺電腦拿才是最令人興奮的事情。組裝電腦少不了要接各種各樣的線材,那么如何辨別各種類型的接口
    發表于 11-11 07:46

    HarmonyOS方舟開發框架容器API的介紹與使用

    對外提供。通過對存儲位置以及屬性的限制,讓每種類型的數據都能在完成自身功能的基礎上剪除冗余分支,保證了數據的高效訪問,提升了應用的性能。 本期,我們將為大家介紹方舟開發框架
    發表于 03-07 11:40

    OpenHarmony應用開發-ArkUI方舟開發框架簡析

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

    各種類型容器的比較

    各種類型容器的比較 頻率的特性
    發表于 02-10 11:49 ?1008次閱讀
    <b class='flag-5'>各種類型</b>電<b class='flag-5'>容器</b>的比較

    主板的各種類型信號的基本走線要求

    主板的各種類型信號的基本走線要求         首先在做圖之前應對一些重要信號進行Space設置和一些線寬設置,如
    發表于 03-20 13:57 ?1636次閱讀

    USB各種類型接口的引腳定義

    USB各種類型接口,包括USB、Mini-USB、Micro-USB的介紹
    發表于 11-30 11:40 ?0次下載

    MPU6050寄存器的各種類型詳細說明

    本文檔的主要內容詳細介紹的是MPU6050寄存器的各種類型詳細說明。
    發表于 08-08 08:00 ?19次下載
    MPU6050寄存器的<b class='flag-5'>各種類型</b>詳細說明

    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 ?4961次閱讀

    各種類型的混頻器及優缺點

    在RF和微波設計,混頻是信號鏈最關鍵的部分之一。今天我們就講講各種類型的混頻器以及各自的優缺點。
    的頭像 發表于 10-19 10:26 ?6041次閱讀

    在MCU開發如何充分利用各種類型的斷點?

    在MCU開發如何充分利用各種類型的斷點?
    的頭像 發表于 09-18 16:22 ?532次閱讀
    在MCU<b class='flag-5'>開發</b><b class='flag-5'>中</b>如何充分利用<b class='flag-5'>各種類型</b>的斷點?

    淺析各種類型的光伏支架

    電子發燒友網站提供《淺析各種類型的光伏支架.doc》資料免費下載
    發表于 11-02 11:37 ?1次下載
    淺析<b class='flag-5'>各種類型</b>的光伏支架