HarmonyOS線性容器特性及使用場景
線性容器實現能按順序訪問的資料結構,其底層主要透過陣列實現,包括ArrayList、Vector、List、LinkedList、Deque、Queue、Stack七種。
線性容器,充分考慮了資料訪問的速度,執行時(Runtime)透過一條位元組碼指令就可以完成增、刪、改、查等操作。
ArrayList
ArrayList即動態陣列,可用來構造全域性的陣列物件。 當需要頻繁讀取集合中的元素時,推薦使用ArrayList。
ArrayList依據泛型定義,要求儲存位置是一片連續的記憶體空間,初始容量大小為10,並支援動態擴容,每次擴容大小為原始容量的1.5倍。
ArrayList進行增、刪、改、查操作的常用API如下:
操作 |
描述 |
增加元素 |
透過add(element: T)函式每次在陣列尾部增加一個元素。 |
透過insert(element: T, index: number)在指定位置插入一個元素。 | |
訪問元素 |
透過arr[index]獲取指定index對應的value值,透過指令獲取保證訪問速度。 |
透過forEach(callbackFn: (value: T, index?: number, arrlist?: ArrayList<T>) => void, thisArg?: Object): void訪問整個ArrayList容器的元素。 | |
透過[Symbol.iterator]():IterableIterator<T>迭代器進行資料訪問。 | |
修改元素 |
透過arr[index] = xxx修改指定index位置對應的value值。 |
刪除元素 |
透過remove(element: T)刪除第一個匹配到的元素。 |
透過removeByRange(fromIndex: number, toIndex:number)刪除指定範圍內的元素。 |
Vector
Vector是指連續儲存結構,可用來構造全域性的陣列物件。Vector依據泛型定義,要求儲存位置是一片連續的記憶體空間,初始容量大小為10,並支援動態擴容,每次擴容大小為原始容量的2倍。
Vector和 ArrayList相似,都是基於陣列實現,但Vector提供了更多運算元組的介面。Vector在支援運運算元訪問的基礎上,還增加了get/set介面,提供更為完善的校驗及容錯機制,滿足使用者不同場景下的需求。
API version 9開始,該介面不再維護,推薦使用 ArrayList。
Vector進行增、刪、改、查操作的常用API如下:
操作 |
描述 |
增加元素 |
透過add(element: T)函式每次在陣列尾部增加一個元素。 |
透過insert(element: T, index: number)在指定位置插入一個元素。 | |
訪問元素 |
透過vec[index]獲取指定index對應的value值,透過指令獲取保證訪問速度。 |
透過get(index: number)獲取指定index位置對應的元素。 | |
透過getLastElement()獲取最後一個元素。 | |
透過getIndexOf(element:T)獲取第一個匹配到元素的位置。 | |
透過getLastIndexOf(element:T)獲取最後一個匹配到元素的位置。 | |
透過forEach(callbackFn: (value: T, index?: number, Vector?: Vector<T>) => void, thisArg?: Object)訪問整個Vector的元素。 | |
透過[Symbol.iterator]():IterableIterator<T>迭代器進行資料訪問。 | |
修改元素 |
透過vec[index]=xxx修改指定index位置對應的value值。 |
透過set(index:number,element:T)修改指定index位置的元素值為element。 | |
透過setLength(newSize:number)設定Vector的長度大小。 | |
刪除元素 |
透過removeByIndex(index:number)刪除index位置對應的value值。 |
透過remove(element:T)刪除第一個匹配到的元素。 | |
透過removeByRange(fromIndex:number,toIndex:number)刪除指定範圍內的元素。 |
List
List可用來構造一個單向連結串列物件,即只能透過頭結點開始訪問到尾節點。List依據泛型定義,在記憶體中的儲存位置可以是不連續的。
List和 LinkedList相比,LinkedList是雙向連結串列,可以快速地在頭尾進行增刪,而List是單向連結串列,無法雙向操作。
當需要頻繁的插入刪除時,推薦使用List高效操作。
可以透過get/set等介面對儲存的元素進行修改,List進行增、刪、改、查操作的常用API如下:
操作 |
描述 |
增加元素 |
透過add(element: T)函式每次在陣列尾部增加一個元素。 |
透過insert(element: T, index: number)在指定位置插入一個元素。 | |
訪問元素 |
透過list[index]獲取指定index對應的value值,透過指令獲取保證訪問速度。 |
透過get(index: number)獲取指定index位置對應的元素。 | |
透過getFirst()獲取第一個元素。 | |
透過getLast()獲取最後一個元素。 | |
透過getIndexOf(element: T)獲取第一個匹配到元素的位置。 | |
透過getLastIndexOf(element: T)獲取最後一個匹配到元素的位置。 | |
透過forEach(callbackfn: (value:T, index?: number, list?: List<T>)=> void,thisArg?: Object)訪問整個List的元素。 | |
透過[Symbol.iterator]():IterableIterator<T>迭代器進行資料訪問。 | |
修改元素 |
透過list[index] = xxx修改指定index位置對應的value值。 |
透過set(index:number, element: T)修改指定index位置的元素值為element。 | |
透過replaceAllElements(callbackFn:(value: T,index?: number,list?: List<T>)=>T,thisArg?: Object)對List內元素進行替換操作。 | |
刪除元素 |
透過removeByIndex(index:number)刪除index位置對應的value值。 |
透過remove(element:T)刪除第一個匹配到的元素。 |
LinkedList
LinkedList可用來構造一個雙向連結串列物件,可以在某一節點向前或者向後遍歷List。LinkedList依據泛型定義,在記憶體中的儲存位置可以是不連續的。
LinkedList和 List相比,LinkedList是雙向連結串列,可以快速地在頭尾進行增刪,而List是單向連結串列,無法雙向操作。
LinkedList和 ArrayList相比,插入資料效率LinkedList優於ArrayList,而查詢效率ArrayList優於LinkedList。
當需要頻繁的插入刪除時,推薦使用LinkedList高效操作。
可以透過get/set等介面對儲存的元素進行修改,LinkedList進行增、刪、改、查操作的常用API如下:
操作 |
描述 |
增加元素 |
透過add(element: T)函式每次在陣列尾部增加一個元素。 |
透過insert(index: number, element: T)在指定位置插入一個元素。 | |
訪問元素 |
透過list[index]獲取指定index對應的value值,透過指令獲取保證訪問速度。 |
透過get(index: number)獲取指定index位置對應的元素。 | |
透過getFirst()獲取第一個元素。 | |
透過getLast()獲取最後一個元素。 | |
透過getIndexOf(element: T)獲取第一個匹配到元素的位置。 | |
透過getLastIndexOf(element: T)獲取最後一個匹配到元素的位置。 | |
透過forEach(callbackFn: (value: T, index?: number, list?: LinkedList<T>) => void, thisArg?: Object)訪問整個LinkedList的元素。 | |
透過[Symbol.iterator]():IterableIterator<T>迭代器進行資料訪問。 | |
修改元素 |
透過list[index]=xxx修改指定index位置對應的value值。 |
透過set(index: number,element: T)修改指定index位置的元素值為element。 | |
刪除元素 |
透過removeByIndex(index: number)刪除index位置對應的value值。 |
透過remove(element: T)刪除第一個匹配到的元素。 |
Deque
Deque可用來構造雙端佇列物件,儲存元素遵循先進先出以及先進後出的規則,雙端佇列可以分別從隊頭或者隊尾進行訪問。
Deque依據泛型定義,要求儲存位置是一片連續的記憶體空間,其初始容量大小為8,並支援動態擴容,每次擴容大小為原始容量的2倍。Deque底層採用迴圈佇列實現,入隊及出隊操作效率都比較高。
Deque和 Queue相比,Queue的特點是先進先出,只能在頭部刪除元素,尾部增加元素。
Deque和 Vector相比,它們都支援在兩端增刪元素,但Deque不能進行中間插入的操作。對頭部元素的插入刪除效率高於Vector,而Vector訪問元素的效率高於Deque。
需要頻繁在集合兩端進行增刪元素的操作時,推薦使用Deque。
Deque進行增、刪、改、查操作的常用API如下:
操作 |
描述 |
增加元素 |
透過insertFront(element: T)函式每次在隊頭增加一個元素。 |
增加元素 |
透過insertEnd(element: T)函式每次在隊尾增加一個元素。 |
訪問元素 |
透過getFirst()獲取隊首元素的value值,但是不進行出隊操作。 |
透過getLast()獲取隊尾元素的value值,但是不進行出隊操作。 | |
透過popFirst()獲取隊首元素的value值,並進行出隊操作。 | |
透過popLast()獲取隊尾元素的value值,並進行出隊操作。 | |
透過forEach(callbackFn:(value: T, index?: number, deque?: Deque<T>) => void, thisArg?: Object)訪問整個Deque的元素。 | |
透過[Symbol.iterator]():IterableIterator<T>迭代器進行資料訪問。 | |
修改元素 |
透過forEach(callbackFn:(value: T, index?: number, deque?: Deque<T>)=> void, thisArg?: Object)對佇列進行修改操作。 |
刪除元素 |
透過popFirst()對隊首元素進行出隊操作並刪除。 |
透過popLast()對隊尾元素進行出隊操作並刪除。 |
Queue
Queue可用來構造佇列物件,儲存元素遵循先進先出的規則。
Queue依據泛型定義,要求儲存位置是一片連續的記憶體空間,初始容量大小為8,並支援動態擴容,每次擴容大小為原始容量的2倍。
Queue底層採用迴圈佇列實現,入隊及出隊操作效率都比較高。
Queue和 Deque相比,Queue只能在一端刪除一端增加,Deque可以兩端增刪。
一般符合先進先出的場景可以使用Queue。
Queue進行增、刪、改、查操作的常用API如下:
操作 |
描述 |
增加元素 |
透過add(element: T)函式每次在隊尾增加一個元素。 |
訪問元素 |
透過getFirst()獲取隊首元素的value值,但是不進行出隊操作。 |
透過pop()獲取隊首元素的value值,並進行出隊操作。 | |
透過forEach(callbackFn: (value: T, index?: number, queue?: Queue<T>) => void,thisArg?: Object)訪問整個Queue的元素。 | |
透過[Symbol.iterator]():IterableIterator<T>迭代器進行資料訪問。 | |
修改元素 |
透過forEach(callbackFn:(value: T, index?: number, queue?: Queue<T>) => void,thisArg?: Object)對佇列進行修改操作。 |
刪除元素 |
透過pop()對隊首進行出隊操作並刪除。 |
Stack
Stack可用來構造棧物件,儲存元素遵循先進後出的規則。
Stack依據泛型定義,要求儲存位置是一片連續的記憶體空間,初始容量大小為8,並支援動態擴容,每次擴容大小為原始容量的1.5倍。Stack底層基於陣列實現,入棧出棧均從陣列的一端操作。
Stack和 Queue相比,Queue基於迴圈佇列實現,只能在一端刪除,另一端插入,而Stack都在一端操作。
一般符合先進後出的場景可以使用Stack。
Stack進行增、刪、改、查操作的常用API如下:
操作 |
描述 |
增加元素 |
透過push(item: T)函式每次在棧頂增加一個元素。 |
訪問元素 |
透過peek()獲取棧頂元素的value值,但是不進行出棧操作。 |
透過pop()獲取棧頂的value值,並進行出棧操作。 | |
透過forEach(callbackFn: (value: T, index?: number, stack?: Stack<T>) => void, thisArg?: Object)訪問整個Stack的元素。 | |
透過[Symbol.iterator]():IterableIterator<T>迭代器進行資料訪問。 | |
透過locate(element: T)獲取元素對應的位置。 | |
修改元素 |
透過forEach(callbackFn:(value: T, index?: number, stack?: Stack<T>) => void, thisArg?: Object)對棧內元素進行修改操作。 |
刪除元素 |
透過pop()對棧頂進行出棧操作並刪除。 |
線性容器的使用
此處列舉常用的線性容器ArrayList、Vector、Deque、Stack、List的使用示例,包括匯入模組、增加元素、訪問元素及修改等操作。示例程式碼如下所示:
// ArrayList import ArrayList from '@ohos.util.ArrayList'; // 匯入ArrayList模組 let arrayList = new ArrayList(); arrayList.add('a'); arrayList.add(1); // 增加元素 console.info(`result: ${arrayList[0]}`); // 訪問元素 arrayList[0] = 'one'; // 修改元素 console.info(`result: ${arrayList[0]}`); // Vector import Vector from '@ohos.util.Vector'; // 匯入Vector模組 let vector = new Vector(); vector.add('a'); let b1 = [1, 2, 3]; vector.add(b1); vector.add(false); // 增加元素 console.info(`result: ${vector[0]}`); // 訪問元素 console.info(`result: ${vector.getFirstElement()}`); // 訪問元素 // Deque import Deque from '@ohos.util.Deque'; // 匯入Deque模組 let deque = new Deque; deque.insertFront('a'); deque.insertFront(1); // 增加元素 console.info(`result: ${deque[0]}`); // 訪問元素 deque[0] = 'one'; // 修改元素 console.info(`result: ${deque[0]}`); // Stack import Stack from '@ohos.util.Stack'; // 匯入Stack模組 let stack = new Stack(); stack.push('a'); stack.push(1); // 增加元素 console.info(`result: ${stack[0]}`); // 訪問元素 stack.pop(); // 彈出元素 console.info(`result: ${stack.length}`); // List import List from '@ohos.util.List'; // 匯入List模組 let list = new List; list.add('a'); list.add(1); let b2 = [1, 2, 3]; list.add(b2); // 增加元素 console.info(`result: ${list[0]}`); // 訪問元素 console.info(`result: ${list.get(0)}`); // 訪問元素
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70009402/viewspace-2986331/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 二、RabbitMQ 進階特性及使用場景 [.NET]MQ
- 併發容器的原理,七大併發容器詳解、及使用場景
- Chrome 外掛特性及實戰場景案例分析Chrome
- LDO線性穩壓器 與 DC-DC穩壓器的器件組成及使用場景
- HarmonyOS 4.0 實況窗上線!支付寶實現醫療場景智慧提醒
- 大資料分析: SAP Sybase IQ功能特性及適用場景大資料
- Streaming特性和適用場景
- Java 自定義註解及使用場景Java
- Java 空集合使用場景及填坑Java
- python中 _、__、__xx__() 區別及使用場景Python
- sql中in和exists的原理及使用場景。SQL
- Redis系列-資料型別及使用場景Redis資料型別
- EF Core 索引器屬性(Indexer property)場景及應用索引Index
- 【譯】Object與Map的異同及使用場景Object
- 【譯】Array與Set的異同及使用場景
- mysqldump常見使用場景及引數參考MySql
- 面試官:Zookeeper是什麼,它有什麼特性與使用場景?面試
- 面試官:ElasticSearch是什麼,它有什麼特性與使用場景?面試Elasticsearch
- 面試官:Kafka是什麼,它有什麼特性與使用場景?面試Kafka
- 面試官:RocketMQ是什麼,它有什麼特性與使用場景?面試MQ
- 城商行容器雲平臺應用場景及持久化儲存實踐持久化
- Vuex使用場景Vue
- Redis使用場景Redis
- RabbitMQ 使用場景MQ
- memcached 和 redis 使用場景及優缺點對比Redis
- Redis 5種資料結構 及使用場景分析Redis資料結構
- G1與CMS各自的使用場景及原理
- Android 進階之HandlerThread 使用場景及原始碼解析Androidthread原始碼
- js閉包及閉包的經典使用場景JS
- HarmonyOS Next中密碼類資料保護場景解析密碼
- JMeter MQTT 在連線測試場景中的使用JMeterMQQT
- Go高階特性 14 | 記憶體分配:new 和 make 的使用場景Go記憶體
- 容器場景要選擇什麼 Linux 版本?Linux
- Python中lambda表示式的優缺點及使用場景Python
- JS的節流、函式防抖 原理及使用場景JS函式
- 阿里雲E-MapReduce產品優勢及使用場景阿里
- 理解JWT鑑權的應用場景及使用建議JWT
- Redis 5種資料結構及對應使用場景Redis資料結構