共计 4049 个字符,预计需要花费 11 分钟才能阅读完成。
非线性容器实现能疾速查找的数据结构,其底层通过 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 如下:
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 如下:
TreeMap
TreeMap 可用来存储具备关联关系的 key-value 键值对汇合,存储元素中 key 是惟一的,每个 key 会对应一个 value 值。
TreeMap 根据泛型定义,汇合中的 key 值是有序的,TreeMap 的底层是一棵二叉树,能够通过树的二叉查找疾速的找到键值对。key 的类型满足 ECMA 规范中要求的类型。TreeMap 中的键值是有序存储的。TreeMap 底层基于红黑树实现,能够进行疾速的插入和删除。
TreeMap 和 HashMap 相比,HashMap 根据键的 hashCode 存取数据,访问速度较快。而 TreeMap 是有序存取,效率较低。
个别须要存储有序键值对的场景,
能够应用 TreeMap。TreeMap 进行增、删、改、查操作的罕用 API 如下:
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 如下:
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 如下:
LightWeightSet
LightWeightSet 可用来存储一系列值的汇合,存储元素中 value 是惟一的。
LightWeightSet 根据泛型定义,采纳更加轻量级的构造,初始默认容量大小为 8,每次扩容大小为原始容量的 2 倍。汇合中的 value 值的查找依赖于 hash 以及二分查找算法,通过一个数组存储 hash 值,而后映射到其余数组中的 value 值,value 的类型满足 ECMA 规范中要求的类型。
LightWeightSet 底层标识惟一 value 基于 hash 实现,其抵触策略为线性探测法,查找策略基于二分查找法。
LightWeightSet 和 HashSet 都是用来存储键值的汇合,LightWeightSet 的占用内存更小。
当须要存取某个汇合或是对某个汇合去重时,举荐应用占用内存更小的 LightWeightSet。
LightWeightSet 进行增、删、改、查操作的罕用 API 如下:
PlainArray
PlainArray 可用来存储具备关联关系的键值对汇合,存储元素中 key 是惟一的,并且对于 PlainArray 来说,其 key 的类型为 number 类型。每个 key 会对应一个 value 值,类型根据泛型的定义,PlainArray 采纳更加轻量级的构造,汇合中的 key 值的查找依赖于二分查找算法,而后映射到其余数组中的 value 值。
初始默认容量大小为 16,每次扩容大小为原始容量的 2 倍。
PlainArray 和 LightWeightMap 都是用来存储键值对,且均采纳轻量级构造,但 PlainArray 的 key 值类型只能为 number 类型。
当须要存储 key 值为 number 类型的键值对时,能够应用 PlainArray。
PlainArray 进行增、删、改、查操作的罕用 API 如下:
非线性容器的应用
此处列举罕用的非线性容器 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)}`); // 拜访元素