UPL5-9——容器选择

容器选择

所谓的容器选择就是指,在 Unity 中使用合适的数据结构类来装载数据

比如:我们常用的 List​ 和 Dictionary 容器,他们就各有各的优劣势

  • List:

    查找的时间复杂度是 O(n)O(n)
    但是它存储结构是连续的

  • Dictionary:

    查找的时间复杂度是 O(1)O(1)
    但是它存储结构是不连续的

所以我们在选择它们时一般会根据他们的特点来进行选择

  1. 经常会遍历并且中间插入较少的数据用 List
  2. 经常会进行键值对查找的数据用 Dictionary

更多容器选择

  1. HashSet<T>

    时间复杂度:查找/添加/删除都是 O(1)O(1),内部使用哈希表实现

    使用场景:
    只关心元素是否存在、不需要顺序、也不需要键值对映射时
    一般用来存储已处理过的对象,比如当前激活的敌人列表等等

  2. Queue<T>

    时间复杂度:入队、出队 O(1)O(1)

    使用场景:适合按顺序处理数据(先进先出),比如对象池中用队列存储池中对象

  3. Stack<T>

    时间复杂度:入栈、出栈都是 O(1)O(1)

    使用场景:适合倒序处理数据(先进后出),行为回退、状态回溯可用 Stack

  4. LinkedList<T>

    时间复杂度:插入、删除节点是 O(1)O(1),查找是 O(n)O(n)
    不连续内存,缓存命中率低,不推荐频繁遍历使用

    使用场景:需要频繁在中间插入、删除元素,但又不关心遍历性能

  5. SortedDictionary<TKey, TValue>​、SortedList<TKey, TValue>

    特点:会自动根据 Key 排序;插入、删除、查找为 O(logn)O(\log n),比 Dictionary 慢,但顺序稳定

    使用场景:需要按顺序遍历所有键值对的数据(如:按时间调度的事件)

  6. ConcurrentDictionary​、ConcurrentQueue

    特点:线程安全,带锁

    使用场景:Unity 主线程中基本不使用,适合多线程工具层代码中

等等