本文同步发表于我的微信公众号,微信搜索 程语新视界 即可关注,每个工作日都有文章更新

一、容器类库概述

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();
    }
  }
}

五、性能优化指南

  1. 初始化容量

// 避免频繁扩容
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)

Logo

讨论HarmonyOS开发技术,专注于API与组件、DevEco Studio、测试、元服务和应用上架分发等。

更多推荐