精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

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

王程 ? 來源:jf_75796907 ? 作者:jf_75796907 ? 2024-02-19 20:23 ? 次閱讀

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
收藏 人收藏

    評論

    相關推薦

    鴻蒙開發學習:【方舟開發框架容器類API的介紹與使用】

    在**方舟**開發框架中,提供了**線性**和**非線性**兩類容器類,共14種,每種容器都有自身的特性及使
    的頭像 發表于 05-13 16:45 ?742次閱讀
    鴻蒙開發學習:【方舟開發框架<b class='flag-5'>容器</b>類API的介紹與使用】

    如何對測量非線性電阻伏安特性的電路進行multisim仿真?

    如何對測量非線性電阻伏安特性的電路進行multisim仿真?
    發表于 04-27 16:10

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

    線性容器實現能按順序訪問的數據結構,其底層主要通過數組實現,包括ArrayList、Vector、List、LinkedList、Deque、Queue、Stack七種。 線性容器,充
    發表于 09-27 15:10

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

    非線性容器實現能快速查找的數據結構,其底層通過hash或者紅黑樹實現,包括HashMap、HashSet、TreeMap、TreeSet、LightWeightMap、LightWeightSet
    發表于 09-27 15:18

    HarmonyOS語言基礎類庫開發指南上線啦!

    自身功能的基礎上去除冗余邏輯,保證了數據的高效訪問,提升了應用的性能。 當前提供了線性非線性兩類容器,共14種。每種容器都有自身的特性及使
    發表于 10-18 16:36

    非線性電阻電路分析

    非線性電阻電路􀂄 4.1 非線性電阻元件的特性􀂄 4.2 非線性電阻電路的方程􀂄 4.3 圖解分析法􀂄 4.4
    發表于 12-04 18:07 ?0次下載
    <b class='flag-5'>非線性</b>電阻電路分析

    鉑電阻溫度傳感器的非線性特性及其線性化校正方法

    詳細地介紹了有關鉑電阻的非線性特性并提出三種線性化校正方法。關鍵詞:溫度傳感器;鉑電阻;非線性;校正
    發表于 06-12 11:25 ?33次下載

    鉑電阻溫度傳感器的非線性特性及其線性化校正方法

    詳細地介紹了有關鉑電阻的非線性特性提出三種線性化校正方法。
    發表于 07-18 15:47 ?44次下載

    基于OTA的模擬元件電路非線性特性建模

    研究了一種典型CMOS 源耦合差分對管電路(OTA)的非線性特性,得到非線性失真項。據此,導出了由OTA 構成模擬電阻和模擬電感以及其他一些模擬元件電路的非線性
    發表于 01-07 14:52 ?17次下載

    非線性電阻特性研究

    非線性電阻特性研究   若通過元件的電流強度與施加到它的兩端的電壓之間不是線性關系.就稱這種元件為非線性元件 . 由于通過元件的電
    發表于 11-24 15:20 ?3705次閱讀
    <b class='flag-5'>非線性</b>電阻<b class='flag-5'>特性</b>研究

    非線性部件的模擬

    非線性部件的模擬 所謂非線性特性,是指它的輸出與輸入信號之間的關系是非線性.在實際物理系統中,往往許多部件在不同程度上都
    發表于 07-25 10:54 ?1329次閱讀
    <b class='flag-5'>非線性</b>部件的模擬

    運算放大電路的非線性特性

    特性的系統的。作為課程的補充,下面討論一下不為人所重視的運算放大電路的非線性特性。 ▌01?運算放大器的非線性 1.運算放大電路 作為信號處理的常用器件,運算放大器,在其信號處理范圍之
    的頭像 發表于 03-10 16:06 ?1.4w次閱讀
    運算放大電路的<b class='flag-5'>非線性</b><b class='flag-5'>特性</b>

    線性負載什么意思?非線性負載是什么意思?

    的。 非線性負載是指在電路中,電流和電壓之間的關系不是簡單的線性關系。非線性負載通常包括電子器件、晶體管、二極管等,這些元件的電流與電壓之間的關系是非線性的。 在實際電路中,
    的頭像 發表于 11-13 16:10 ?1711次閱讀

    線性電阻和非線性電阻的區別

    線性電阻和非線性電阻的區別? 線性電阻和非線性電阻是兩種常見的電子元件,它們在電路中具有不同的特性和行為。本文將詳盡、詳實、細致地討論
    的頭像 發表于 12-07 17:03 ?1682次閱讀

    非線性電路的基本特點是什么

    非線性電路是一類具有非線性特性的電路,其輸出與輸入之間的關系不是線性的。非線性電路在電子技術、通信技術、自動控制等領域有著廣泛的應用。本文將
    的頭像 發表于 07-09 11:15 ?442次閱讀