HarmonyOS 非線性容器特性及使用場(chǎng)景
非線性容器實(shí)現(xiàn)能快速查找的數(shù)據(jù)結(jié)構(gòu),其底層通過 hash 或者紅黑樹實(shí)現(xiàn),包括 HashMap、HashSet、TreeMap、TreeSet、LightWeightMap、LightWeightSet、PlainArray 七種。非線性容器中的 key 及 value 的類型均滿足 ECMA 標(biāo)準(zhǔn)。
HashMap
HashMap 可用來存儲(chǔ)具有關(guān)聯(lián)關(guān)系的 key-value 鍵值對(duì)集合,存儲(chǔ)元素中 key 是唯一的,每個(gè) key 會(huì)對(duì)應(yīng)一個(gè) value 值。
HashMap 依據(jù)泛型定義,集合中通過 key 的 hash 值確定其存儲(chǔ)位置,從而快速找到鍵值對(duì)。HashMap 的初始容量大小為 16,并支持動(dòng)態(tài)擴(kuò)容,每次擴(kuò)容大小為原始容量的 2 倍。HashMap 底層基于 HashTable 實(shí)現(xiàn),沖突策略采用鏈地址法。
HashMap 和 TreeMap 相比,HashMap 依據(jù)鍵的 hashCode 存取數(shù)據(jù),訪問速度較快。而 TreeMap 是有序存取,效率較低。
HashSet 基于 HashMap 實(shí)現(xiàn)。HashMap 的輸入參數(shù)由 key、value 兩個(gè)值組成。在 HashSet 中,只對(duì) value 對(duì)象進(jìn)行處理。
需要快速存取、刪除以及插入鍵值對(duì)數(shù)據(jù)時(shí),推薦使用 HashMap。
HashMap 進(jìn)行增、刪、改、查操作的常用 API 如下:
操作 | 描述 |
---|---|
增加元素 | 通過 set (key: K, value: V) 函數(shù)每次在 HashMap 增加一個(gè)鍵值對(duì)。 |
訪問元素 | 通過 get (key: K) 獲取 key 對(duì)應(yīng)的 value 值。 |
通過 keys () 返回一個(gè)迭代器對(duì)象,包含 map 中的所有 key 值。 | |
通過 values () 返回一個(gè)迭代器對(duì)象,包含 map 中的所有 value 值。 | |
通過 entries () 返回一個(gè)迭代器對(duì)象,包含 map 中的所有鍵值對(duì)。 | |
forEach (callbackFn: (value?: V, key?: K, map?: HashMap) => void, thisArg?: Object) 訪問整個(gè) map 的元素。 | |
通過 Symbol.iterator:IterableIterator<[K,V]> 迭代器進(jìn)行數(shù)據(jù)訪問。 | |
修改元素 | 通過 replace (key: K, newValue: V) 對(duì)指定 key 對(duì)應(yīng)的 value 值進(jìn)行修改操作。 |
通過 forEach (callbackFn: (value?: V, key?: K, map?: HashMap) => void, thisArg?: Object) 對(duì) map 中元素進(jìn)行修改操作。 | |
刪除元素 | 通過 remove (key: K) 對(duì) map 中匹配到的鍵值對(duì)進(jìn)行刪除操作。 |
通過 clear () 清空整個(gè) map 集合。 |
HashSet
HashSet 可用來存儲(chǔ)一系列值的集合,存儲(chǔ)元素中 value 是唯一的。
HashSet 依據(jù)泛型定義,集合中通過 value 的 hash 值確定其存儲(chǔ)位置,從而快速找到該值。HashSet 初始容量大小為 16,支持動(dòng)態(tài)擴(kuò)容,每次擴(kuò)容大小為原始容量的 2 倍。value 的類型滿足 ECMA 標(biāo)準(zhǔn)中要求的類型。HashSet 底層數(shù)據(jù)結(jié)構(gòu)基于 HashTable 實(shí)現(xiàn),沖突策略采用鏈地址法。
HashSet 基于 HashMap 實(shí)現(xiàn)。在 HashSet 中,只對(duì) value 對(duì)象進(jìn)行處理。
HashSet 和 TreeSet 相比,HashSet 中的數(shù)據(jù)無序存放,即存放元素的順序和取出的順序不一致,而 TreeSet 是有序存放。它們集合中的元素都不允許重復(fù),但 HashSet 允許放入 null 值,TreeSet 不允許。
可以利用 HashSet 不重復(fù)的特性,當(dāng)需要不重復(fù)的集合或需要去重某個(gè)集合的時(shí)候使用。
HashSet 進(jìn)行增、刪、改、查操作的常用 API 如下:
操作 | 描述 |
---|---|
增加元素 | 通過 add (value: T) 函數(shù)每次在 HashSet 增加一個(gè)值。 |
訪問元素 | 通過 values () 返回一個(gè)迭代器對(duì)象,包含 set 中的所有 value 值。 |
通過 entries () 返回一個(gè)迭代器對(duì)象,包含類似鍵值對(duì)的數(shù)組,鍵值都是 value。 | |
通過 forEach (callbackFn: (value?: T, key?: T, set?: HashSet) => void, thisArg?: Object) 訪問整個(gè) set 的元素。 | |
通過 Symbol.iterator:IterableIterator 迭代器進(jìn)行數(shù)據(jù)訪問。 | |
修改元素 | 通過 forEach (callbackFn: (value?: T, key?: T, set?: HashSet) => void, thisArg?: Object) 對(duì) set 中 value 進(jìn)行修改操作。 |
刪除元素 | 通過 remove (value: T) 對(duì) set 中匹配到的值進(jìn)行刪除操作。 |
通過 clear () 清空整個(gè) set 集合。 |
TreeMap
TreeMap 可用來存儲(chǔ)具有關(guān)聯(lián)關(guān)系的 key-value 鍵值對(duì)集合,存儲(chǔ)元素中 key 是唯一的,每個(gè) key 會(huì)對(duì)應(yīng)一個(gè) value 值。
TreeMap 依據(jù)泛型定義,集合中的 key 值是有序的,TreeMap 的底層是一棵二叉樹,可以通過樹的二叉查找快速的找到鍵值對(duì)。key 的類型滿足 ECMA 標(biāo)準(zhǔn)中要求的類型。TreeMap 中的鍵值是有序存儲(chǔ)的。TreeMap 底層基于紅黑樹實(shí)現(xiàn),可以進(jìn)行快速的插入和刪除。
TreeMap 和 HashMap 相比,HashMap 依據(jù)鍵的 hashCode 存取數(shù)據(jù),訪問速度較快。而 TreeMap 是有序存取,效率較低。
一般需要存儲(chǔ)有序鍵值對(duì)的場(chǎng)景,可以使用 TreeMap。
TreeMap 進(jìn)行增、刪、改、查操作的常用 API 如下:
操作 | 描述 |
---|---|
增加元素 | 通過 set (key: K,value: V) 函數(shù)每次在 TreeMap 增加一個(gè)鍵值對(duì)。 |
訪問元素 | 通過 get (key: K) 獲取 key 對(duì)應(yīng)的 value 值。 |
通過 getFirstKey () 獲取 map 中排在首位的 key 值。 | |
通過 getLastKey () 獲取 map 中排在未位的 key 值。 | |
通過 keys () 返回一個(gè)迭代器對(duì)象,包含 map 中的所有 key 值。 | |
通過 values () 返回一個(gè)迭代器對(duì)象,包含 map 中的所有 value 值。 | |
通過 entries () 返回一個(gè)迭代器對(duì)象,包含 map 中的所有鍵值對(duì)。 | |
通過 forEach (callbackFn: (value?: V, key?: K, map?: TreeMap) => void, thisArg?: Object) 訪問整個(gè) map 的元素。 | |
通過 Symbol.iterator:IterableIterator<[K,V]> 迭代器進(jìn)行數(shù)據(jù)訪問。 | |
修改元素 | 通過 replace (key: K,newValue: V) 對(duì)指定 key 對(duì)應(yīng)的 value 值進(jìn)行修改操作。 |
通過 forEach (callbackFn: (value?: V, key?: K, map?: TreeMap) => void, thisArg?: Object) 對(duì) map 中元素進(jìn)行修改操作。 | |
刪除元素 | 通過 remove (key: K) 對(duì) map 中匹配到的鍵值對(duì)進(jìn)行刪除操作。 |
通過 clear () 清空整個(gè) map 集合。 |
TreeSet
TreeSet 可用來存儲(chǔ)一系列值的集合,存儲(chǔ)元素中 value 是唯一的。
TreeSet 依據(jù)泛型定義,集合中的 value 值是有序的,TreeSet 的底層是一棵二叉樹,可以通過樹的二叉查找快速的找到該 value 值,value 的類型滿足 ECMA 標(biāo)準(zhǔn)中要求的類型。TreeSet 中的值是有序存儲(chǔ)的。TreeSet 底層基于紅黑樹實(shí)現(xiàn),可以進(jìn)行快速的插入和刪除。
TreeSet 基于 TreeMap 實(shí)現(xiàn),在 TreeSet 中,只對(duì) value 對(duì)象進(jìn)行處理。TreeSet 可用于存儲(chǔ)一系列值的集合,元素中 value 唯一且有序。
TreeSet 和 HashSet 相比,HashSet 中的數(shù)據(jù)無序存放,而 TreeSet 是有序存放。它們集合中的元素都不允許重復(fù),但 HashSet 允許放入 null 值,TreeSet 不允許。
一般需要存儲(chǔ)有序集合的場(chǎng)景,可以使用 TreeSet。
TreeSet 進(jìn)行增、刪、改、查操作的常用 API 如下:
操作 | 描述 |
---|---|
增加元素 | 通過 add (value: T) 函數(shù)每次在 HashSet 增加一個(gè)值。 |
訪問元素 | 通過 values () 返回一個(gè)迭代器對(duì)象,包含 set 中的所有 value 值。 |
通過 entries () 返回一個(gè)迭代器對(duì)象,包含類似鍵值對(duì)的數(shù)組,鍵值都是 value。 | |
通過 getFirstValue () 獲取 set 中排在首位的 value 值。 | |
通過 getLastValue () 獲取 set 中排在未位的 value 值。 | |
通過 forEach (callbackFn: (value?: T, key?: T, set?: TreeSet) => void, thisArg?: Object) 訪問整個(gè) set 的元素。 | |
通過 Symbol.iterator:IterableIterator 迭代器進(jìn)行數(shù)據(jù)訪問。 | |
修改元素 | 通過 forEach (callbackFn: (value?: T, key?: T, set?: TreeSet) => void, thisArg?: Object) 對(duì) set 中 value 進(jìn)行修改操作。 |
刪除元素 | 通過 remove (value: T) 對(duì) set 中匹配到的值進(jìn)行刪除操作。 |
通過 clear () 清空整個(gè) set 集合。 |
LightWeightMap
LightWeightMap 可用來存儲(chǔ)具有關(guān)聯(lián)關(guān)系的 key-value 鍵值對(duì)集合,存儲(chǔ)元素中 key 是唯一的,每個(gè) key 會(huì)對(duì)應(yīng)一個(gè) value 值。LightWeightMap 依據(jù)泛型定義,采用更加輕量級(jí)的結(jié)構(gòu),底層標(biāo)識(shí)唯一 key 通過 hash 實(shí)現(xiàn),其沖突策略為線性探測(cè)法。集合中的 key 值的查找依賴于 hash 值以及二分查找算法,通過一個(gè)數(shù)組存儲(chǔ) hash 值,然后映射到其他數(shù)組中的 key 值以及 value 值,key 的類型滿足 ECMA 標(biāo)準(zhǔn)中要求的類型。
初始默認(rèn)容量大小為 8,每次擴(kuò)容大小為原始容量的 2 倍。
LightWeightMap 和 HashMap 都是用來存儲(chǔ)鍵值對(duì)的集合,LightWeightMap 占用內(nèi)存更小。
當(dāng)需要存取 key-value 鍵值對(duì)時(shí),推薦使用占用內(nèi)存更小的 LightWeightMap。
LightWeightMap 進(jìn)行增、刪、改、查操作的常用 API 如下:
操作 | 描述 |
---|---|
增加元素 | 通過 set (key: K,value: V) 函數(shù)每次在 LightWeightMap 增加一個(gè)鍵值對(duì)。 |
訪問元素 | 通過 get (key: K) 獲取 key 對(duì)應(yīng)的 value 值。 |
通過 getIndexOfKey (key: K) 獲取 map 中指定 key 的 index。 | |
通過 getIndexOfValue (value: V) 獲取 map 中指定 value 出現(xiàn)的第一個(gè)的 index。 | |
通過 keys () 返回一個(gè)迭代器對(duì)象,包含 map 中的所有 key 值。 | |
通過 values () 返回一個(gè)迭代器對(duì)象,包含 map 中的所有 value 值。 | |
通過 entries () 返回一個(gè)迭代器對(duì)象,包含 map 中的所有鍵值對(duì)。 | |
通過 getKeyAt (index: number) 獲取指定 index 對(duì)應(yīng)的 key 值。 | |
通過 getValueAt (index: number) 獲取指定 index 對(duì)應(yīng)的 value 值。 | |
通過 forEach (callbackFn: (value?: V, key?: K, map?: LightWeightMap) => void, thisArg?: Object) 訪問整個(gè) map 的元素 | |
通過 Symbol.iterator:IterableIterator<[K,V]> 迭代器進(jìn)行數(shù)據(jù)訪問。 | |
修改元素 | 通過 setValueAt (index: number, newValue: V) 對(duì)指定 index 對(duì)應(yīng)的 value 值進(jìn)行修改操作。 |
通過 forEach (callbackFn: (value?: V, key?: K, map?: LightWeightMap) => void, thisArg?: Object) 對(duì) map 中元素進(jìn)行修改操作。 | |
刪除元素 | 通過 remove (key: K) 對(duì) map 中匹配到的鍵值對(duì)進(jìn)行刪除操作。 |
通過 removeAt (index: number) 對(duì) map 中指定 index 的位置進(jìn)行刪除操作。 | |
通過 clear () 清空整個(gè) map 集合。 |
LightWeightSet
LightWeightSet 可用來存儲(chǔ)一系列值的集合,存儲(chǔ)元素中 value 是唯一的。
LightWeightSet 依據(jù)泛型定義,采用更加輕量級(jí)的結(jié)構(gòu),初始默認(rèn)容量大小為 8,每次擴(kuò)容大小為原始容量的 2 倍。集合中的 value 值的查找依賴于 hash 以及二分查找算法,通過一個(gè)數(shù)組存儲(chǔ) hash 值,然后映射到其他數(shù)組中的 value 值,value 的類型滿足 ECMA 標(biāo)準(zhǔn)中要求的類型。
LightWeightSet 底層標(biāo)識(shí)唯一 value 基于 hash 實(shí)現(xiàn),其沖突策略為線性探測(cè)法,查找策略基于二分查找法。
LightWeightSet 和 HashSet 都是用來存儲(chǔ)鍵值的集合,LightWeightSet 的占用內(nèi)存更小。
當(dāng)需要存取某個(gè)集合或是對(duì)某個(gè)集合去重時(shí),推薦使用占用內(nèi)存更小的 LightWeightSet。
LightWeightSet 進(jìn)行增、刪、改、查操作的常用 API 如下:
操作 | 描述 |
---|---|
增加元素 | 通過 add (obj: T) 函數(shù)每次在 LightWeightSet 增加一個(gè)值。 |
訪問元素 | 通過 getIndexOf (key: T) 獲取對(duì)應(yīng)的 index 值。 |
通過 values () 返回一個(gè)迭代器對(duì)象,包含 map 中的所有 value 值。 | |
通過 entries () 返回一個(gè)迭代器對(duì)象,包含 map 中的所有鍵值對(duì)。 | |
通過 getValueAt (index: number) 獲取指定 index 對(duì)應(yīng)的 value 值。 | |
通過 forEach (callbackFn: (value?: T, key?: T, set?: LightWeightSet) => void, thisArg?: Object) 訪問整個(gè) set 的元素。 | |
通過 Symbol.iterator:IterableIterator 迭代器進(jìn)行數(shù)據(jù)訪問。 | |
修改元素 | 通過 forEach (callbackFn: (value?: T, key?: T, set?: LightWeightSet) => void, thisArg?: Object) 對(duì) set 中元素進(jìn)行修改操作。 |
刪除元素 | 通過 remove (key: K) 對(duì) set 中匹配到的鍵值對(duì)進(jìn)行刪除操作。 |
通過 removeAt (index: number) 對(duì) set 中指定 index 的位置進(jìn)行刪除操作。 | |
通過 clear () 清空整個(gè) set 集合。 |
PlainArray
PlainArray 可用來存儲(chǔ)具有關(guān)聯(lián)關(guān)系的鍵值對(duì)集合,存儲(chǔ)元素中 key 是唯一的,并且對(duì)于 PlainArray 來說,其 key 的類型為 number 類型。每個(gè) key 會(huì)對(duì)應(yīng)一個(gè) value 值,類型依據(jù)泛型的定義,PlainArray 采用更加輕量級(jí)的結(jié)構(gòu),集合中的 key 值的查找依賴于二分查找算法,然后映射到其他數(shù)組中的 value 值。
初始默認(rèn)容量大小為 16,每次擴(kuò)容大小為原始容量的 2 倍。
PlainArray 和 LightWeightMap 都是用來存儲(chǔ)鍵值對(duì),且均采用輕量級(jí)結(jié)構(gòu),但 PlainArray 的 key 值類型只能為 number 類型。
當(dāng)需要存儲(chǔ) key 值為 number 類型的鍵值對(duì)時(shí),可以使用 PlainArray。
PlainArray 進(jìn)行增、刪、改、查操作的常用 API 如下:
操作 | 描述 |
---|---|
增加元素 | 通過 add (key: number,value: T) 函數(shù)每次在 PlainArray 增加一個(gè)鍵值對(duì)。 |
訪問元素 | 通過 get (key: number) 獲取 key 對(duì)應(yīng)的 value 值。 |
通過 getIndexOfKey (key: number) 獲取 PlainArray 中指定 key 的 index。 | |
通過 getIndexOfValue (value: T) 獲取 PlainArray 中指定 value 的 index。 | |
通過 getKeyAt (index: number) 獲取指定 index 對(duì)應(yīng)的 key 值。 | |
通過 getValueAt (index: number) 獲取指定 index 對(duì)應(yīng)的 value 值。 | |
通過 forEach (callbackFn: (value: T, index?: number, PlainArray?: PlainArray) => void, thisArg?: Object) 訪問整個(gè) plainarray 的元素。 | |
通過 Symbol.iterator:IterableIterator<[number, T]> 迭代器進(jìn)行數(shù)據(jù)訪問。 | |
修改元素 | 通過 setValueAt (index:number, value: T) 對(duì)指定 index 對(duì)應(yīng)的 value 值進(jìn)行修改操作。 |
通過 forEach (callbackFn: (value: T, index?: number, PlainArray?: PlainArray) => void, thisArg?: Object) 對(duì) plainarray 中元素進(jìn)行修改操作。 | |
刪除元素 | 通過 remove (key: number) 對(duì) plainarray 中匹配到的鍵值對(duì)進(jìn)行刪除操作。 |
通過 removeAt (index: number) 對(duì) plainarray 中指定 index 的位置進(jìn)行刪除操作。 | |
通過 removeRangeFrom (index: number, size: number) 對(duì) plainarray 中指定范圍內(nèi)的元素進(jìn)行刪除操作。 | |
通過 clear () 清空整個(gè) PlainArray 集合。 |
非線性容器的使用
此處列舉常用的非線性容器 HashMap、TreeMap、LightWeightMap、PlainArray 的使用示例,包括導(dǎo)入模塊、增加元素、訪問元素及修改等操作,示例代碼如下所示:
// HashMap import HashMap from '@ohos.util.HashMap'; // 導(dǎo)入HashMap模塊 let hashMap = new HashMap(); hashMap.set('a', 123); hashMap.set(4, 123); // 增加元素 console.info(`result: ${hashMap.hasKey(4)}`); // 判斷是否含有某元素 console.info(`result: ${hashMap.get('a')}`); // 訪問元素 // TreeMap import TreeMap from '@ohos.util.TreeMap'; // 導(dǎo)入TreeMap模塊 let treeMap = new TreeMap(); treeMap.set('a', 123); treeMap.set('6', 356); // 增加元素 console.info(`result: ${treeMap.get('a')}`); // 訪問元素 console.info(`result: ${treeMap.getFirstKey()}`); // 訪問首元素 console.info(`result: ${treeMap.getLastKey()}`); // 訪問尾元素 // LightWeightMap import LightWeightMap from '@ohos.util.LightWeightMap'; // 導(dǎo)入LightWeightMap模塊 let lightWeightMap = new LightWeightMap(); lightWeightMap.set('x', 123); lightWeightMap.set('8', 356); // 增加元素 console.info(`result: ${lightWeightMap.get('a')}`); // 訪問元素 console.info(`result: ${lightWeightMap.get('x')}`); // 訪問元素 console.info(`result: ${lightWeightMap.getIndexOfKey('8')}`); // 訪問元素 // PlainArray import PlainArray from '@ohos.util.PlainArray' // 導(dǎo)入PlainArray模塊 let plainArray = new PlainArray(); plainArray.add(1, 'sdd'); plainArray.add(2, 'sff'); // 增加元素 console.info(`result: ${plainArray.get(1)}`); // 訪問元素 console.info(`result: ${plainArray.getKeyAt(1)}`); // 訪問元素
審核編輯 黃宇
-
非線性
+關(guān)注
關(guān)注
1文章
205瀏覽量
23041 -
hashmap
+關(guān)注
關(guān)注
0文章
14瀏覽量
2269 -
HarmonyOS
+關(guān)注
關(guān)注
79文章
1966瀏覽量
29962
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論