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

一、标准集合容器

1. Array(数组)

// 创建方式
let arr1: number[] = [1, 2, 3];
let arr2: Array<string> = ['a', 'b', 'c'];

// 常用操作
arr1.push(4);          // 添加元素
arr2.pop();            // 移除末尾元素
arr1.forEach(item => console.log(item));

2. Set(集合)

// 创建方式
let set1: Set<number> = new Set([1, 2, 3]);
let set2 = new Set<string>();

// 常用操作
set1.add(4);           // 添加元素
set1.delete(1);        // 删除元素
set1.has(2);           // 检查存在

3. Map(字典)

// 创建方式
let map1: Map<string, number> = new Map([['a', 1], ['b', 2]]);
let map2 = new Map<number, boolean>();

// 常用操作
map1.set('c', 3);      // 添加键值对
map1.get('a');         // 获取值
map1.delete('b');      // 删除键值对

4. WeakSet/WeakMap(弱引用集合)

// 创建方式
let weakSet = new WeakSet<object>();
let weakMap = new WeakMap<object, string>();

// 特点:键必须是对象,不阻止垃圾回收

二、鸿蒙特有容器

1. LinkedList(双向链表)

import LinkedList from '@ohos.util.LinkedList';

// 创建方式
let list = new LinkedList<number>();

// 常用操作
list.add(1);           // 添加元素
list.addFirst(0);      // 头部添加
list.removeLast();     // 移除尾部

2. ArrayList(动态数组)

import ArrayList from '@ohos.util.ArrayList';

// 创建方式
let arrayList = new ArrayList<string>();

// 常用操作
arrayList.add('a');
arrayList.get(0);      // 获取元素
arrayList.sort();      // 排序

3. HashMap/TreeMap(哈希/树映射)

import HashMap from '@ohos.util.HashMap';
import TreeMap from '@ohos.util.TreeMap';

// HashMap示例
let hashMap = new HashMap<string, number>();
hashMap.set('key', 123);

// TreeMap示例(自动排序)
let treeMap = new TreeMap<number, string>();
treeMap.set(3, 'c');
treeMap.set(1, 'a');

4. LightWeightMap/LightWeightSet(轻量级容器)

import { LightWeightMap, LightWeightSet } from '@ohos.util';

// LightWeightMap示例
let lwMap = new LightWeightMap<string, number>();
lwMap.set('score', 100);

// LightWeightSet示例
let lwSet = new LightWeightSet<number>();
lwSet.add(42);

三、队列和栈结构

1. Queue(队列)

import Queue from '@ohos.util.Queue';

// 创建方式
let queue = new Queue<number>();

// 常用操作
queue.add(1);          // 入队
queue.poll();          // 出队

2. Deque(双端队列)

import Deque from '@ohos.util.Deque';

// 创建方式
let deque = new Deque<string>();

// 常用操作
deque.addFirst('a');
deque.addLast('z');

3. Stack(栈)

import Stack from '@ohos.util.Stack';

// 创建方式
let stack = new Stack<boolean>();

// 常用操作
stack.push(true);      // 压栈
stack.pop();           // 弹栈

四、容器性能对比

容器类型插入性能索引访问查找性能(值)删除性能有序性重复元素内存连续性适用场景
ArrayO(1)末尾O(n)中间O(1)O(n)O(n)有序允许连续随机访问、高频遍历
LinkedListO(1)O(n)O(n)O(1)有序允许非连续频繁头尾操作
ArrayListO(1)末尾O(n)中间O(1)O(n)O(n)有序允许连续动态数组需求
HashSetO(1)不支持O(1)O(1)无序不允许哈希分散快速存在性检查
TreeSetO(log n)不支持O(log n)O(log n)键有序不允许树结构有序唯一值集合
HashMapO(1)不支持O(1)O(1)无序键唯一哈希分散键值对快速查找
TreeMapO(log n)不支持O(log n)O(log n)键有序键唯一树结构有序键值对
QueueO(1)队尾O(n)O(n)O(1)队首有序允许依赖实现FIFO队列
DequeO(1)两端O(n)O(n)O(1)两端有序允许依赖实现双端操作
StackO(1)栈顶O(n)O(n)O(1)栈顶有序允许依赖实现LIFO栈

五、容器转换方法

1. 数组与其他容器互转

// Array转Set
let arr = [1, 2, 3];
let setFromArr = new Set(arr);

// Set转Array
let arrFromSet = Array.from(setFromArr);

// Map转Array
let map = new Map([['a', 1], ['b', 2]]);
let entriesArr = Array.from(map.entries());

2. 容器间转换

// ArrayList转Array
let arrayList = new ArrayList<number>();
arrayList.add(1);
let arr = arrayList.convertToArray();

// HashMap转Map
let hashMap = new HashMap<string, number>();
hashMap.set('key', 123);
let map = new Map(hashMap.entries());

六、实际应用示例

1. 使用HashMap缓存数据

import HashMap from '@ohos.util.HashMap';

@Entry
@Component
struct CacheExample {
  private cache = new HashMap<string, string>();

  build() {
    Column() {
      Button('添加缓存')
        .onClick(() => {
          this.cache.set('user_123', JSON.stringify({
            name: '张三',
            age: 25
          }));
        })
      
      Button('读取缓存')
        .onClick(() => {
          const userData = this.cache.get('user_123');
          console.log(userData);
        })
    }
  }
}

2. 使用Queue处理任务

import Queue from '@ohos.util.Queue';

class TaskManager {
  private taskQueue = new Queue<() => void>();
  
  addTask(task: () => void) {
    this.taskQueue.add(task);
  }
  
  processTasks() {
    while (this.taskQueue.length > 0) {
      const task = this.taskQueue.poll();
      task?.();
    }
  }
}

3. 使用TreeMap实现排行榜

import TreeMap from '@ohos.util.TreeMap';

@Entry
@Component
struct Leaderboard {
  private scores = new TreeMap<number, string>((a, b) => b - a); // 降序排列

  build() {
    Column() {
      Button('添加分数')
        .onClick(() => {
          const name = `玩家${Math.floor(Math.random() * 100)}`;
          const score = Math.floor(Math.random() * 1000);
          this.scores.set(score, name);
        })
      
      ForEach(Array.from(this.scores.entries()), ([score, name]) => {
        Text(`${name}: ${score}`).fontSize(16)
      })
    }
  }
}

七、总结

  1. 选择合适容器:

    • 需要键值对:优先考虑HashMap
    • 需要自动排序:使用TreeMap
    • 简单集合:Array或Set
    • 频繁插入删除:LinkedList
  2. 性能考虑:

    • 大数据集避免使用Array查找
    • 频繁修改的集合考虑轻量级容器
    • 线程安全场景使用Concurrent容器
  3. 内存管理:

    • 临时数据使用WeakMap/WeakSet
    • 及时清理不再使用的容器引用
  4. API熟悉:

    • 掌握各种容器的迭代方式
    • 了解容量调整机制
    • 熟悉各容器的边界条件处理
Logo

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

更多推荐