OpenHarmony 3.1 Beta版本關鍵特性解析——ArkUI容器類API介紹

来源:https://www.cnblogs.com/openharmony/archive/2022/04/24/16186277.html
-Advertisement-
Play Games

本期,我們將為大家介紹 ArkUI 開發框架中容器類的各種類型以及相關 API 的使用。 ...


(以下內容來自開發者分享,不代表 OpenHarmony 項目群工作委員會觀點)


劉鑫

容器類,顧名思義就是存儲的類,用於存儲各種數據類型的元素,並具備一系列處理數據元素的方法。在 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 如下:

 

 

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 可用來構造一個雙向鏈表對象,可以在某一節點向前或者向後遍歷 List。LinkedList 依據泛型定義,在記憶體中的存儲位置可以是不連續的。

 

可以通過 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、PlainArray 七種。非線性容器類中的 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.getFirstElement()); // 訪問元素

// 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 開發框架的容器類開發出更多高性能的應用。

 

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 鏡像下載、功能變數名稱解析、時間同步請點擊 阿裡雲開源鏡像站 Virtual Box 安裝虛擬機 一、下載安裝Virtual Box 1. 下載Virtual Box 2. 安裝Virtual Box 雙擊Virtual Box安裝程式進入安裝歡迎界面,如下圖所示: 單擊 下一步 按鈕後進入下一安裝界面,在 ...
  • 一:創建maven項目 導入maven <dependencies> <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-hdfs</artifactId> <version>2.7.6</version> </d ...
  • 鏡像下載、功能變數名稱解析、時間同步請點擊 阿裡雲開源鏡像站 背景: Centos7上需要創建一個用戶leojiang,而用戶時間不純在系統上,但是還是報錯說用戶已經存在。 1、假設您正在嘗試添加一個名為“leojiang”的用戶並且您收到以下錯誤。 [root@leo]# useradd -m -d /h ...
  • 安裝Prometheus wget https://github.com/prometheus/prometheus/releases/download/v2.34.0/prometheus-2.34.0.linux-amd64.tar.gz tar -zxvf prometheus-2.34.0. ...
  • 一、MicroPython 簡介 Python,是一種面向對象的解釋型電腦程式設計語言,它是純粹的自由軟體,源代碼和解釋器CPython遵循GPL(GNU General Public License)協議。Python的設計目標之一是讓代碼具備高度的可閱讀性。它設計時儘量使用其它語言經常使用的標 ...
  • 簡介 mydumper 是一款開源的 MySQL 邏輯備份工具,主要由 C 語言編寫。與 MySQL 自帶的 mysqldump 類似,但是 mydumper 更快更高效。 mydumper 的一些優點特性: 輕量級C語言開發 支持多線程備份數據,備份後按表生成多個備份文件 支持事務性和非事務性表一 ...
  • 分享嘉賓:姚凱飛 Club Factory 推薦演算法負責人 編輯整理:作者授權發佈 出品平臺:DataFunTalk 導讀: 關於用戶畫像的技術分享,分享給有需要的小伙伴,這裡給的部分案例並非本人的作品,而是來自於其它優秀的公司和前輩,大部分來自於他們的技術分享及網路圖片,如果不妥歡迎批評指正。 - ...
  • RxJava + Retrofit怎麼請求網路,具體的用法這裡就不講了,本文只講一些重點源碼。 版本如下: okhttp : "com.squareup.okhttp3:okhttp:3.10.0", okhttp3_integration : "com.github.bumptech.glide: ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...