色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

OpenHarmony 3.1 Beta版本關鍵特性解析——ArkUI開發框架容器類API的介紹與使用

OpenAtom OpenHarmony ? 來源:OpenAtom OpenHarmony ? 作者:OpenAtom OpenHarmony ? 2022-03-17 10:48 ? 次閱讀

容器類,顧名思義就是存儲的類,用于存儲各種數據類型的元素,并具備一系列處理數據元素的方法。在 ArkUI 開發框架中,容器類采用了類似靜態的語言來實現,并通過 NAPI 框架對外提供。通過對存儲位置以及屬性的限制,讓每種類型的數據都能在完成自身功能的基礎上剪除冗余分支,保證了數據的高效訪問,提升了應用的性能。本期,我們將為大家介紹 ArkUI 開發框架中容器類的各種類型以及相關 API 的使用。

容器類API介紹

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

1.1線性容器類

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

1.1.1 ArrayList

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

2003aeda-a542-11ec-952b-dac502259ad0.jpg

1.1.2 Vector

Vector 是指連續存儲結構,可用來構造全局的數組對象。Vector 依據泛型定義,要求存儲位置是一片連續的內存空間,初始容量大小為 10,并支持動態擴容,每次擴容大小為原始容量的2倍。

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

20192210-a542-11ec-952b-dac502259ad0.jpg

1.1.3 List

List 可用來構造一個單向鏈表對象,即只能通過頭結點開始訪問到尾節點。List 依據泛型定義,在內存中的存儲位置可以是不連續的。

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

202bfe62-a542-11ec-952b-dac502259ad0.jpg

1.1.4 LinkedList

LinkedList 可用來構造一個雙向鏈表對象,可以在某一節點向前或者向后遍歷 List。LinkedList 依據泛型定義,在內存中的存儲位置可以是不連續的。

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

2041e218-a542-11ec-952b-dac502259ad0.jpg

1.1.5 Queue

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

2056050e-a542-11ec-952b-dac502259ad0.jpg

1.1.6 Deque

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

20698458-a542-11ec-952b-dac502259ad0.jpg

1.1.7 Stack

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

207f1296-a542-11ec-952b-dac502259ad0.jpg

1.2非線性容器類

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

1.2.1 HashMap

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

209407be-a542-11ec-952b-dac502259ad0.jpg

1.2.2 HashSet

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

20b05234-a542-11ec-952b-dac502259ad0.jpg

1.2.3 TreeMap

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

20c2a51a-a542-11ec-952b-dac502259ad0.jpg

1.2.4 TreeSet

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

20d5e92c-a542-11ec-952b-dac502259ad0.jpg

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 如下:

20ea6b54-a542-11ec-952b-dac502259ad0.png

1.2.6 LightWeightSet

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

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

210bde06-a542-11ec-952b-dac502259ad0.jpg

1.2.7 PlainArray

PlainArray 可用來存儲具有關聯關系的鍵值對集合,存儲元素中 key 是唯一的,并且對于 PlainArray 來說,其 key 的類型為 number 類型。每個 key 會對應一個 value 值,類型依據泛型的定義,PlainArray 采用更加輕量級的結構,集合中的 key 值的查找依賴于二分查找算法,然后映射到其他數組中的 value 值。

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

211f161a-a542-11ec-952b-dac502259ad0.jpg

容器類的實現

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

2.1 容器類初始化

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

2140c364-a542-11ec-952b-dac502259ad0.jpg

2.2 容器類接口調用

在 ArkUI 開發框架中,容器類 API 的調用流程如下,用戶先通過 new ArrayList 進入引擎得到對應的 arraylist 對象,然后可以通過 add 接口向對象中添加元素,元素最終會添加到一片和該 arraylist 綁定的內存空間。可以通過 [] 操作符進行元素獲取,對于容器類而言,引擎會直接通過快速路徑訪問到元素存儲位置,返回該值。

215356aa-a542-11ec-952b-dac502259ad0.jpg

2.3 容器類對象模型

在 ArkUI 開發框架中,構造容器類對象模型的流程如下圖所示,在運行時禁止再向對象上添加 Properties 屬性,ArrayList 借用對象模型中的 elements 位置存儲元素。

2169c3ea-a542-11ec-952b-dac502259ad0.jpg

實現說明:通過 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 判斷等操作。

217e4022-a542-11ec-952b-dac502259ad0.jpg

容器類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));//訪問元素

至此以上就是本期全部內容,期待廣大開發者通過 ArkUI 開發框架的容器類開發出更多高性能的應用。

審核編輯 :李倩


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

    關注

    2

    文章

    1505

    瀏覽量

    62176
  • 容器
    +關注

    關注

    0

    文章

    496

    瀏覽量

    22078
  • OpenHarmony
    +關注

    關注

    25

    文章

    3729

    瀏覽量

    16405

原文標題:OpenHarmony 3.1 Beta版本關鍵特性解析——ArkUI開發框架容器類API的介紹與使用

文章出處:【微信號:gh_e4f28cfa3159,微信公眾號:OpenAtom OpenHarmony】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    開源鴻蒙5.0 Release版本關鍵特性解讀

    特性。如果想了解該版本完整的特性,請參考版本的Release notes。 一 系統功能 1.1 應用框架能力優化 應用
    的頭像 發表于 12-23 13:58 ?481次閱讀

    基于ArkTS語言的OpenHarmony APP應用開發:HelloOpenharmony

    1、程序簡介該程序是基于OpenHarmony標準系統編寫的UI應用:HelloOpenHarmony。本案例是基于API9接口開發。本案
    的頭像 發表于 09-15 08:09 ?423次閱讀
    基于ArkTS語言的<b class='flag-5'>OpenHarmony</b> APP應用<b class='flag-5'>開發</b>:Hello<b class='flag-5'>Openharmony</b>

    鴻蒙開發ArkUI-X基礎知識:【ArkUI代碼工程及構建介紹

    ArkUI作為OpenHarmony的默認開發框架,在本項目(ArkUI-X)中需要做到一套代碼同時支持多平臺構建,所以會采取共倉
    的頭像 發表于 05-25 16:45 ?2119次閱讀
    鴻蒙<b class='flag-5'>開發</b><b class='flag-5'>ArkUI</b>-X基礎知識:【<b class='flag-5'>ArkUI</b>代碼工程及構建<b class='flag-5'>介紹</b>】

    鴻蒙ArkUI-X框架開發:【開發準備】

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

    鴻蒙ArkUI-X跨平臺開發:【bility開發說明(iOS端)】

    本文介紹ArkUI框架擴展到iOS平臺所需要的必要及其使用說明,開發者基于OpenHarmony
    的頭像 發表于 05-21 14:35 ?913次閱讀
    鴻蒙<b class='flag-5'>ArkUI</b>-X跨平臺<b class='flag-5'>開發</b>:【bility<b class='flag-5'>開發</b>說明(iOS端)】

    鴻蒙ArkUI-X跨平臺開發:【bility開發說明(Android平臺)】

    本文介紹ArkUI框架擴展到Android平臺所需要的必要的及其使用說明,開發者基于OpenHarm
    的頭像 發表于 05-21 10:54 ?978次閱讀
    鴻蒙<b class='flag-5'>ArkUI</b>-X跨平臺<b class='flag-5'>開發</b>:【bility<b class='flag-5'>開發</b>說明(Android平臺)】

    鴻蒙ArkUI-X跨平臺開發:【SDK目錄結構介紹

    本文檔配套ArkUI-X,將OpenHarmony ArkUI開發框架擴展到不同的OS平臺,比如Android和iOS平臺,讓
    的頭像 發表于 05-20 16:28 ?831次閱讀
    鴻蒙<b class='flag-5'>ArkUI</b>-X跨平臺<b class='flag-5'>開發</b>:【SDK目錄結構<b class='flag-5'>介紹</b>】

    鴻蒙ArkUI-X跨平臺開發:【 應用工程結構說明】

    本文檔配套ArkUI-X,將OpenHarmony ArkUI開發框架擴展到不同的OS平臺,比如Android和iOS平臺,讓
    的頭像 發表于 05-19 21:05 ?613次閱讀
    鴻蒙<b class='flag-5'>ArkUI</b>-X跨平臺<b class='flag-5'>開發</b>:【 應用工程結構說明】

    鴻蒙開發:【OpenHarmony 4.0 Release指導】

    OpenHarmony 4.0版本如期而至,開發套件同步升級到API 10。相比3.2 Release版本,新增4000多個
    的頭像 發表于 05-14 09:59 ?1531次閱讀
    鴻蒙<b class='flag-5'>開發</b>:【<b class='flag-5'>OpenHarmony</b> 4.0 Release指導】

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

    在**方舟**開發框架中,提供了**線性**和**非線性**兩容器,共14種,每種容器都有自
    的頭像 發表于 05-13 16:45 ?894次閱讀
    鴻蒙<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'>API</b>的<b class='flag-5'>介紹</b>與使用】

    鴻蒙ArkUI開發學習:【渲染控制語法】

    ArkUI開發框架是一套構建 HarmonyOS / OpenHarmony 應用界面的聲明式UI開發
    的頭像 發表于 04-09 16:40 ?1020次閱讀
    鴻蒙<b class='flag-5'>ArkUI</b><b class='flag-5'>開發</b>學習:【渲染控制語法】

    OpenAtom OpenHarmony 4.1 Release版本正式發布

    近日,OpenAtom OpenHarmony(以下簡稱“OpenHarmony”)4.1 Release版本如期而至,開發套件同步升級到API
    的頭像 發表于 04-07 11:43 ?713次閱讀

    OpenHarmony鴻蒙應用如何使用滾動組件

    Studio 版本:DevEco Studio 3.1.1 Release(3.1.0.501) SDK 版本:4.1.5.5 (full sdk) API 版本:Version 1
    的頭像 發表于 02-24 18:48 ?1336次閱讀
    <b class='flag-5'>OpenHarmony</b>鴻蒙應用如何使用滾動<b class='flag-5'>類</b>組件

    跨Android、iOS、鴻蒙多平臺框架ArkUI-X

    ArkUI是一套構建分布式應用界面的聲明式UI開發框架。它使用極簡的UI信息語法、豐富的UI組件、以及實時界面預覽工具,幫助您提升移動應用界面開發效率30%。您只需使用一套ArkTS
    的頭像 發表于 01-31 14:52 ?1823次閱讀
    跨Android、iOS、鴻蒙多平臺<b class='flag-5'>框架</b><b class='flag-5'>ArkUI</b>-X

    鴻蒙開發-ArkUI框架實戰【日歷應用 】

    生命周期,加深對OpenHarmony應用開發的理解。 效果展示 開發環境 開發工具:DevEco Studio 3.1 Release
    發表于 01-17 21:37
    主站蜘蛛池模板: 国产精品免费大片一区二区| 中文国产在线观看| 亚洲精品国产高清嫩草影院| 99在线免费视频| 久草色香蕉视频在线| 神马电影dy888午夜我不卡| 999zyz色资源站在线观看| 久久本道久久综合伊人| 亚洲视频免费看| 娇小亚裔被两个黑人| 亚洲精品入口一区二区乱麻豆精品 | 18亚洲男同gay1069| 九九热国产视频| 艳鉧动漫1~6全集观看在线| 娇妻玩4P被三个男人伺候电影| 亚洲.欧美.中文字幕在线观看| 国产高清精品自在久久| 兽皇VIDEO另类HD| 国产老头与老太hd| 亚洲国产精品一区二区动图| 簧片在线观看| 在线播放无码字幕亚洲| 快播dvd吧| beeg日本老师按摩| 日本妈妈在线观看中文字幕| 俄罗斯aaaaa一级毛片| 无码乱人伦一区二区亚洲一| 国产精品一久久香蕉国产线看| 亚洲成人免费看| 寂寞夜晚免费观看视频| 曰本女人牲交视频免费| 嗯呐啊唔高H兽交| 高清无码中文字幕影片| 小夫妻天天恶战| 久久99re热在线观看视频| 37pao成人国产永久免费视频 | 韩国伦理三级| 2021扫黑风暴在线观看免费完整版| 欧美日韩精品久久久免费观看| 高h浪荡文辣文神奇宝贝| 亚洲国产区中文在线观看|