请说明 Dart 语言提供的集合类型,并解析 List、Set 和 Map 之间的主要差异,包括它们的特性、适用场景以及存储和访问方式。
考察说明
考查对 Dart 集合类型的熟悉程度及对 List、Set、Map 差异的理解。
回答思路
- 【回答框架 1】Dart 中的集合类型主要有 List、Set 和 Map。List 是有序可重复的集合,元素按索引访问,允许重复元素,适合需要按位置访问或保持插入顺序的场景。Set 是无序且元素唯一的集合,不保证迭代顺序,用于去重和快速成员检测,底层一般基于哈希表实现。Map 是键值对集合,键唯一,值可重复,通过键来访问值,适合映射关系。
- 【回答框架 2】三者底层实现不同:List 基于索引数组或可增长数组,查找用 get 是 O(1),但按值查找是 O(n);Set 和 Map 基于哈希表,添加、删除和查找平均 O(1),但需注意哈希冲突和迭代顺序不固定。List 和 Set 都实现了 Iterable,Map 本身不是 Iterable,但可通过 entries、keys 和 values 获得可迭代视图。
- 【回答框架 3】在 API 上,List 提供 add, insert, removeAt 等与索引相关的方法;Set 提供 add, remove, contains 等,contains 效率高;Map 提供 putIfAbsent, containsKey, containsValue 等。选择时根据需求:需要顺序和索引用 List,需要去重和高效存在性检查用 Set,需要键值映射用 Map。
- 【回答框架 4】可变性上,Dart 有可变的 List, Set, Map 以及不可变版本,例如 const 列表。默认构造的集合都是可变的,但可以通过 List.unmodifiable 等创建不可变集合,但原题未明确版本时,不深入特定 API 细节。
- 【关键点 1】List 有序可重复,基于索引,适合按位置访问;
- 【关键点 2】Set 无序且元素唯一,适合去重和高效 contains;
- 【关键点 3】Map 存储键值对,键唯一,通过键访问值;
- 【关键点 4】三者均支持泛型,并有可变与不可变变体;
- 【关键点 5】主要根据顺序、唯一性、键值映射需求选择集合类型。
- 【易错点 1】误以为 Set 和 Map 的迭代顺序固定,实际上哈希表不保证顺序;
- 【易错点 2】混淆 List 的按值查找复杂度,误认为查找是 O(1);
- 【易错点 3】Map 不是 Iterable,不能直接使用 forEach 遍历,需通过 entries 等。