Solidity面试题更新 2026-08-03

在 Solidity 中,mapping 和数组(array)有哪些不同之处?它们分别适用于哪些使用场景?

考察说明

考查对 Solidity 两种常用数据结构的理解,包括存储特性、访问方式与实际应用场景。

回答思路

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