在 Solidity 中,mapping 和数组(array)有哪些不同之处?它们分别适用于哪些使用场景?
考察说明
考查对 Solidity 两种常用数据结构的理解,包括存储特性、访问方式与实际应用场景。
回答思路
- 【回答框架 1】mapping 是一种键值对映射结构,初始化时不占用存储空间,无法直接遍历,且只能通过键访问值,未初始化的键返回默认值(如 0、false)。它适合用于账户余额、角色权限、白名单等需要快速随机访问且数据量大的场合。
- 【回答框架 2】array 是连续存储的线性结构,能够通过索引遍历,支持 push、pop 等操作,访问时需注意下标越界。它适合用于需要保持顺序、遍历全部元素或获取长度(length)的场景。
- 【回答框架 3】二者在 gas 成本上存在差异:mapping 的插入和查询通常固定且较低,但无法整体删除;array 的操作可能涉及元素移动(如 delete 或插入),且遍历大量元素会产生较高 gas,因此需谨慎使用。
- 【回答框架 4】总结而言,mapping 更注重键值映射和随机访问,array 更注重有序集合和遍历。在合约设计中,开发者常根据业务需求选型,如有需要可结合二者(如用 mapping 存储数据,用数组记录键列表)。
- 【关键点 1】mapping 不可遍历,数组可遍历并支持 length 和索引访问。
- 【关键点 2】mapping 访问未初始化的键返回默认值,数组访问越界会触发异常。
- 【关键点 3】mapping 适合随机访问和大量键值映射,数组适合有序列表和遍历场景。
- 【关键点 4】数组的插入和删除可能涉及元素移动,gas 成本通常高于 mapping 的简单读写。
- 【易错点 1】误以为 mapping 可以遍历,实际上它不支持遍历,若需遍历需额外维护键的数组。
- 【易错点 2】忽视数组越界访问,在 Solidity 0.8.0 之前可能造成未知行为,0.8.0 后会自动回滚。
- 【易错点 3】在大型数组上频繁遍历时可能消耗过高 gas,导致交易失败或成本过高。