Dart List可存储的元素最大数量是多少?
Dart List 最大可容纳元素上限说明
Dart 语言规范没有定义统一的 List 长度硬限制,实际可容纳的最大元素数量取决于运行环境以及 List 存储的元素类型,具体可以分为两类场景:
1. Native 运行环境(Flutter 移动端/桌面端、Dart 服务端)
这里的运行环境指 Dart 以 JIT 或 AOT 模式编译为原生机器码运行的场景,上限由系统可分配给进程的内存决定:
- 32位系统:进程可访问的用户态内存通常在 1~2GB 区间,除去 Dart 运行时本身占用的内存,若存储的是对象引用(每个引用占4字节),List 最大长度约为 2.5亿~5亿;若存储的是基础值类型(比如
int、double或 TypedData 元素),根据单个元素的内存占用不同,上限会对应提升,比如Uint8List单个元素占1字节,最大长度可达 10亿~20亿。 - 64位系统:理论寻址上限为
2^64,常规消费级设备的物理内存远低于这个阈值,实际上限就是设备剩余可用内存,正常业务场景下完全不可能触顶,无需额外关注。
2. Web 运行环境(编译为 JavaScript)
Dart 编译为 JS 后,List 本质映射为 JavaScript 的 Array 类型,ECMAScript 规范明确规定 Array 长度的硬上限为 2^32 - 1(也就是 4294967295),超出这个长度会直接抛出 RangeError。
补充说明:官方提到的可增长 List 仅扩容逻辑和固定长度 List 有差异,最大长度上限和上述规则完全一致。可增长 List 每次扩容会申请当前长度 1.5~2 倍的连续内存,只要剩余内存足够就能持续扩容,直到触达当前环境的上限。
如果需要确认当前运行环境的实际最大长度,可以运行以下测试代码:
void main() { try { final list = []; while (true) { list.add(null); } } catch (e) { print('当前环境普通List最大长度约为:${(e as OutOfMemoryError).unsuccessfulAllocationSize ?? list.length}'); } }
内容的提问来源于stack exchange,提问作者Cheam Jing-En
相关产品推荐
相关产品推荐

