Dart 语言数据结构学习笔记
一、核心集合类型
1. List(列表)
dart
// 动态类型列表(默认接收 dynamic 类型)
var dynamicList = [1, 'a', true];
// 指定类型列表(推荐写法)
List<int> numbers = [1, 2, 3];
**新手注意点:**
- 未指定类型时,List 默认接收 `dynamic` 类型,可能导致后续操作出现类型错误
- 使用 `const` 创建不可变列表(编译时常量)
```dart
const immutableList = [1, 2, 3]; // 无法修改元素- 注意
add()与addAll()的区别:后者用于合并列表
2. Map(映射)
dart
// 字面量声明
Map<String, int> scores = {
'Alice': 90,
'Bob': 85
};
// 构造函数声明
var capitals = Map<String, String>();
capitals['China'] = 'Beijing';易错陷阱:
- 键类型必须一致,否则会触发类型错误
dart
var map = {'a': 1, 2: 'b'}; // 混合类型键会导致后续操作异常- 使用
??运算符处理可能不存在的键
dart
int score = scores['Charlie'] ?? 0; // 当键不存在时返回默认值3. Set(集合)
dart
Set<String> fruits = {'apple', 'banana', 'orange'};
Set<int> numbers = {1, 2, 3};特别说明:
- 元素唯一性验证发生在运行时,重复值不会报错但会被自动过滤
- 没有索引访问,必须通过迭代器遍历
dart
for(var fruit in fruits) {
print(fruit);
}二、特殊数据结构
1. Queue(队列)
dart
import 'dart:collection';
var queue = Queue<int>();
queue.addLast(1); // 入队
queue.removeFirst(); // 出队使用场景:
- 需要先进先出(FIFO)操作时
- 相比 List 在频繁增删首部元素时性能更好
2. 不可变集合
dart
// 使用 const 构造函数
final constantSet = const {'a', 'b', 'c'};
final deepConst = const [
const [1, 2],
const [3, 4]
];注意:
- 嵌套 const 需要每层都声明
- 修改不可变集合会抛出运行时错误
三、新手进阶技巧
1. 空安全特性
- Dart 2.12+ 强制空安全
dart
List<int>? nullableList; // 必须显式声明可空
print(nullableList?.length ?? 0); // 安全访问2. 类型推断陷阱
- 动态类型集合可能隐藏错误
dart
var list = []; // 实际是 List<dynamic>
list.add(1);
list.add('a'); // 编译不报错,但可能引发后续逻辑错误3. 性能优化
- 预分配列表容量提升性能
dart
List<int> bigList = List.filled(1000, 0); // 预分配内存- 优先使用
final集合变量
dart
final finalList = [1, 2, 3]; // 防止意外重新赋值4. 实用操作技巧
- 展开操作符(...)
dart
var combined = [...list1, ...list2];- 条件添加元素
dart
var list = [
'a',
if (showB) 'b',
for (var i=0; i<3; i++) 'item$i'
];