1. List(列表)
列表是有序且可重复的集合,类似 C++ 的 vector。
常用方法
添加元素
var fruits = ['苹果', '香蕉'];
// 在末尾添加单个元素
fruits.add('橙子'); // ['苹果', '香蕉', '橙子']
// 在末尾添加多个元素
fruits.addAll(['葡萄', '西瓜']); // ['苹果', '香蕉', '橙子', '葡萄', '西瓜']
// 在指定位置插入
fruits.insert(1, '草莓'); // ['苹果', '草莓', '香蕉', '橙子', '葡萄', '西瓜']
// 在指定位置插入多个
fruits.insertAll(0, ['芒果', '猕猴桃']); // ['芒果', '猕猴桃', '苹果', '草莓', '香蕉', '橙子', '葡萄', '西瓜']
删除元素
var fruits = ['苹果', '香蕉', '橙子', '香蕉'];
// 删除指定元素(只删除第一个)
fruits.remove('香蕉'); // ['苹果', '橙子', '香蕉']
// 删除指定位置的元素
fruits.removeAt(1); // ['苹果', '香蕉'] 返回被删除的元素
// 删除最后一个元素
fruits.removeLast(); // ['苹果', '香蕉'] 返回被删除的元素
// 删除符合条件的元素
fruits.removeWhere((item) => item.length > 2); // 删除长度大于2的
// 清空列表
fruits.clear(); // []
查找元素
var fruits = ['苹果', '香蕉', '橙子', '香蕉'];
// 查找元素位置(从前往后)
fruits.indexOf('香蕉'); // 1
// 查找元素位置(从后往前)
fruits.lastIndexOf('香蕉'); // 3
// 检查是否包含元素
fruits.contains('苹果'); // true
修改元素
var fruits = ['苹果', '香蕉', '橙子'];
// 修改指定位置元素
fruits[1] = '草莓'; // ['苹果', '草莓', '橙子']
// 替换一个元素
fruits.replaceRange(0, 1, ['芒果']); // ['芒果', '草莓', '橙子']
// 随机打乱顺序
fruits.shuffle(); // 随机排序
遍历与转换
var numbers = [1, 2, 3, 4, 5];
// for 循环
for (var i = 0; i < numbers.length; i++) {
print(numbers[i]);
}
// for-in 循环
for (var num in numbers) {
print(num);
}
// forEach 方法
numbers.forEach((num) => print(num));
// map 转换
var doubled = numbers.map((n) => n * 2).toList(); // [2, 4, 6, 8, 10]
// where 过滤
var evens = numbers.where((n) => n % 2 == 0).toList(); // [2, 4]
// reduce 聚合
var sum = numbers.reduce((a, b) => a + b); // 15
// any 和 every 判断
numbers.any((n) => n > 3); // true(是否有大于3的元素)
numbers.every((n) => n > 0); // true(是否所有元素都大于0)
排序
var numbers = [3, 1, 4, 1, 5, 9, 2];
// 升序排序
numbers.sort(); // [1, 1, 2, 3, 4, 5, 9]
// 自定义排序(降序)
numbers.sort((a, b) => b.compareTo(a)); // [9, 5, 4, 3, 2, 1, 1]
2. Set(集合)
集合是无序且不重复的集合,类似 C++ 的 unordered_set。
创建方式
// 使用类型
var colors = <String>{'红色', '绿色', '蓝色'};
// 类型推断
var numbers = {1, 2, 3, 4, 5};
// 空集合(注意:{} 会默认创建 Map,而不是 Set)
var emptySet = <int>{};
常用方法
添加与删除
var fruits = {'苹果', '香蕉'};
// 添加单个元素
fruits.add('橙子'); // {'苹果', '香蕉', '橙子'}
// 如果已存在,不会添加(无重复)
// 添加多个元素
fruits.addAll(['葡萄', '西瓜']); // {'苹果', '香蕉', '橙子', '葡萄', '西瓜'}
// 删除元素
fruits.remove('香蕉'); // {'苹果', '橙子', '葡萄', '西瓜'}
// 删除符合条件的
fruits.removeWhere((item) => item.length > 2);
// 清空集合
fruits.clear();
集合运算
var setA = {1, 2, 3, 4};
var setB = {3, 4, 5, 6};
// 交集
var intersection = setA.intersection(setB); // {3, 4}
// 并集
var union = setA.union(setB); // {1, 2, 3, 4, 5, 6}
// 差集(A有B没有的)
var difference = setA.difference(setB); // {1, 2}
// 检查是否包含
setA.contains(1); // true
setA.containsAll([1, 2]); // true(是否包含所有)
遍历
var fruits = {'苹果', '香蕉', '橙子'};
for (var fruit in fruits) {
print(fruit);
}
fruits.forEach((fruit) => print(fruit));
3. List vs Set 核心区别
| 特性 | List(列表) | Set(集合) |
|---|---|---|
| 有序性 | ✅ 有序(按索引) | ❌ 无序 |
| 重复元素 | ✅ 允许 | ❌ 不允许 |
| 索引访问 | ✅ 支持 [index] |
❌ 不支持 |
| 适用场景 | 需要按顺序访问数据 | 需要去重或检查存在性 |
| 性能 | 查找较慢 O(n) | 查找快 O(1) |
示例对比
// List - 有序可重复
var list = ['A', 'B', 'A', 'C'];
print(list[0]); // 'A' - 可以用索引访问
print(list); // [A, B, A, C]
// Set - 无序不重复
var set = {'A', 'B', 'A', 'C'};
// print(set[0]); // 错误!不能索引访问
print(set); // {A, B, C} - 自动去重
4. 快速记忆
🎯 列表:有序有重复,需要索引访问 → 用
List🎯 集合:无需去重,快速查找 → 用
Set🎯 常用操作:
- 添加:add()/addAll()
- 删除:remove()/removeLast()/clear()
- 查找:indexOf()/contains()
- 遍历:for-in/forEach()/map()





Comments NOTHING