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