Skip to content

集合

集合,任意对象类型的泛型序列,包括数组、紧缩数组或字典

在本章中,我们将会初步了解GDScript中的集合类型

集合在GDScript中属于内置容器类型,正如其名,它们是一种数据容器,用于储存多个数据

集合类型属于引用类型Variant,这意味着,它们始终按引用传递,修改其元素会影响原始集合

集合类型主要分为以下三种:

  • 数组:任意类型的泛型有序序列,提供一系列便利方法

  • 紧缩数组:静态类型有序序列,大批量数据下拥有更佳的性能,支持的数据类型有限

  • 字典:关联容器,使用键值对来对数据进行查询修改,字典所擅长的任务是数组所不擅长的,在插入/删除/移动方面最快

数据偏好

更详细的内容见官方文档: 最佳实践-数据偏好

GDScript有三种数据结构,Array数组、Dictionary字典、Object对象

时间复杂度

这个术语来自于算法分析中的大O表示法

它描述了最坏情况下的运行时长大概有多慢:

“随着问题域的大小增加,算法的运行时长……”

  • 常量时间,O(1):“……不会增加。”(极快)

  • 对数时间,O(log n):“……会以较慢的速度增长。”

  • 线性时间,O(n):“……会以相同的速度增长。”(数据越多耗时越长)

  • 平方时间,O(n²):“……会以很快的速度增长。”(极慢)

比如:

  • 用数组查找第5个元素,是O(1)

  • 用数组查找“值为42”的元素,是O(n)

  • 用字典通过key取值,是O(1)

  • 用字典查找“谁的值是42”,是O(n)

数组

数组就像一排编号整齐的箱子,每个格子可以放一个东西(值),我们可以通过“编号”快速找到某个格子。

适合场景:顺序存放数据、需要遍历、按索引访问的情况

  • 迭代非常快 —— 只要往前走一步就能拿到下一个格子

  • 按位置取值最快 —— 想拿第 3 个元素?直接看第 3 个格子就好

  • 查找值很慢 —— 要找特定内容,只能一个个翻过去看(就像找钥匙那样)

  • 在中间插入或删除元素较慢,在开头插入删除元素最慢 —— 插个值要把后面一堆格子全挪一挪

  • 在末尾添加或删除最快

如果你经常要在开头插入或删除元素,可以先把数组用reverse() 反转,再在结尾操作,最后再反转回来,就可以避免性能瓶颈

字典

字典是用“键(key)”来找值的,就像翻电话簿一样可以直接找到联系人,而不需要知道他排第几。

适合场景:按名字或标签快速访问数据、结构更灵活的存储

  • 插入、删除、查找都很快 —— 因为用了“哈希算法”(就是把 key 快速转换成地址)

  • 迭代也很快 —— 默认会保留插入顺序(可以按顺序遍历)

  • 按 key 取值设值最快

  • 按值找 key 很慢 —— 字典不是为这设计的,需要遍历整本字典才能找

对象

GDScript对象的特性不在本文讨论范围,详见后续面向对象章节

使用建议

  • 要跑得快用数组(迭代)

  • 要记得谁是谁用字典

  • 要高频操作时避免在数组中间插入元素

  • 数据量一多就卡死?考虑使用更快的结构如紧缩数组,或协程