集合,任意对象类型的泛型序列,包括数组、紧缩数组或字典
在本章中,我们将会初步了解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对象的特性不在本文讨论范围,详见后续面向对象章节
-
要跑得快用数组(迭代)
-
要记得谁是谁用字典
-
要高频操作时避免在数组中间插入元素
-
数据量一多就卡死?考虑使用更快的结构如紧缩数组,或协程