鸿蒙开发中容器类有哪些?
·
本文同步发表于我的微信公众号,微信搜索 程语新视界 即可关注,每个工作日都有文章更新
一、容器类库概述
1. 核心分类
| 类型 | 特点 | 适用场景 |
|---|---|---|
| 线性容器 | 顺序存储,底层基于数组或链表实现 | 频繁读取、顺序访问数据 |
| 非线性容器 | 通过哈希或红黑树实现,快速查找 | 键值对存储、去重集合 |
2. 性能对比

二、线性容器详解
1. ArrayList(动态数组)
特点:
- 连续内存空间,初始容量10,扩容系数1.5倍
- 随机访问效率高(O(1)),插入删除效率低(O(n))
示例代码:
// 初始化
let arrList = new ArrayList<number>();
arrList.add(1); // 尾部添加
arrList.insert(0, 10); // 插入到索引0
// 遍历(三种方式)
// 1. forEach
arrList.forEach((value, index) => {
console.log(`索引${index}: ${value}`);
});
// 2. 迭代器
let iter = arrList[Symbol.iterator]();
for (let item of iter) { /* ... */ }
// 3. 下标访问
for (let i = 0; i < arrList.length; i++) {
console.log(arrList[i]); // 类似数组语法
}
API速查:
| 方法 | 作用 |
|---|---|
removeByRange(from, to) |
删除区间元素 |
replaceAllElements(callback) |
批量替换元素 |
2. LinkedList(双向链表)
特点:
- 非连续存储,头尾操作效率高(O(1))
- 支持双向遍历,但随机访问效率低(O(n))
高级用法:
// 实现LRU缓存
class LRUCache {
private list = new LinkedList<number>();
private capacity = 10;
access(key: number) {
this.list.remove(key); // 先删除(如果存在)
this.list.addFirst(key); // 插入头部
if (this.list.length > this.capacity) {
this.list.removeLast(); // 淘汰末尾
}
}
}
3. Deque(双端队列)
环形队列实现:
let deque = new Deque<string>();
deque.addFirst("head"); // 队头插入
deque.addLast("tail"); // 队尾插入
let first = deque.popFirst(); // 队头弹出
性能对比:
| 操作 | Deque时间复杂度 | ArrayList时间复杂度 |
|---|---|---|
| 头部插入 | O(1) | O(n) |
| 中间访问 | O(n) | O(1) |
三、非线性容器详解
1. HashMap(哈希表)
冲突解决:链地址法 示例:
let map = new HashMap<string, number>();
map.set("apple", 10);
map.set("banana", 20);
// 高级查询
if (map.hasKey("apple")) {
console.log(map.get("apple")); // 10
}
// 遍历Entry
let entries = map.entries();
for (let [key, value] of entries) {
console.log(`${key}: ${value}`);
}
2. TreeSet(红黑树集合)
自动排序特性:
let treeSet = new TreeSet<number>();
treeSet.add(3);
treeSet.add(1); // 自动排序为[1, 3]
// 范围查询
let subset = treeSet.subSet(1, 5); // [1, 3]
四、高级应用场景
1. 嵌套容器(JSON解析)
// 解析多层JSON
let jsonMap = new HashMap<string, ArrayList<string>>();
jsonMap.set("fruits", new ArrayList(["apple", "banana"]));
// 序列化
let jsonStr = JSON.stringify(Array.from(jsonMap.entries()));
2. 线程安全方案
// 使用锁包装容器
class SafeContainer<T> {
private lock = new Lock();
private data = new ArrayList<T>();
add(item: T) {
this.lock.lock();
try {
this.data.add(item);
} finally {
this.lock.unlock();
}
}
}
五、性能优化指南
-
初始化容量
// 避免频繁扩容
let optimizedMap = new HashMap<string, number>(1000);
2. 遍历方式选择
| 方法 | 速度 | 内存 |
|---|---|---|
| forEach | 快 | 低 |
| 迭代器 | 中 | 中 |
| 下标访问 | 慢 | 高 |
3. 内存泄漏排查
// 监控容器大小
setInterval(() => {
console.log(`当前Map大小: ${map.size}`);
}, 5000);
六、总结对比
| 容器类型 | 最佳场景 | 性能特点 |
|---|---|---|
| ArrayList | 高频读取、顺序访问 | 读O(1),写O(n) |
| LinkedList | 频繁增删、双向遍历 | 头尾操作O(1),随机访问O(n) |
| HashMap | 键值对快速查找 | 平均O(1),最差O(n) |
| TreeSet | 需要自动排序 | 增删查O(log n) |
更多推荐



所有评论(0)