VBA/VB6 Collection究竟是什么?其底层数据模型探究
关于VBA/VB6 Collection的底层结构分析
这确实是个戳中VB6/VBA老玩家痛点的问题——微软官方文档对Collection的内部实现几乎只字不提,只教你怎么用Add、Item、Remove这些方法,但从性能表现倒推,我们能还原出它的大致底层模型:
从性能表现反推结构
- 整数键的O(N)访问速度:当你用整数索引(比如
col.Item(3))访问元素时,性能随元素数量线性下降,这完全符合双向单链表的特征。因为整数索引对应的是元素的插入顺序,访问时需要从链表的头部或尾部开始遍历,直到找到对应位置的节点,所以时间复杂度是O(N)。 - 字符串键的O(logN)访问速度:正如你提到的社区分析(wqw的评论),用字符串键访问时性能表现为对数级增长,这说明
Collection内部为字符串键维护了一个有序索引结构(大概率是平衡二叉搜索树,比如红黑树)。这个结构会把字符串键映射到链表中的对应节点,查找时通过树结构快速定位,时间复杂度降到O(logN)。
推测的整体底层模型
简单来说,Collection是双向单链表 + 字符串键索引树的组合体:
- 所有元素实际存储在双向单链表中,支持在任意位置插入、删除元素,同时保留插入顺序(这也是整数索引的依据);
- 当你添加带字符串键的元素时,除了把节点加入链表,还会在索引树中新增一个键值对,键是你指定的字符串,值是链表节点的引用;
- 访问时:
- 用整数索引:直接遍历链表到对应位置;
- 用字符串键:先通过索引树找到节点引用,再直接访问该节点。
为什么官方没有公开细节?
VB6是上世纪90年代的技术,微软当年并没有开放这类基础控件的底层实现细节,加上后来VB6被逐步淘汰,官方也就没有补充相关文档。这些结论都是社区开发者通过大量性能测试、逆向VB6运行时二进制文件得到的共识。
内容的提问来源于stack exchange,提问作者Adam Ryczkowski




