Skip to content

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'
];