HarmonyOS線性容器特性及使用場景

HarmonyOS開發者社群發表於2023-09-27

線性容器實現能按順序訪問的資料結構,其底層主要透過陣列實現,包括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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章