集合是什么:不重复且无序的容器
集合(Set)就像是一个“只收独一无二物品的袋子”。你往袋子里扔东西,如果已经有相同的,袋子会自动忽略。而且袋子里的物品没有固定顺序——你扔进去的顺序和拿出来的顺序可能不一样。集合的核心特性就是:元素不重复、元素无序。
底层:哈希表实现
集合的底层通常用哈希表(Hash Table)实现。哈希表通过一个“哈希函数”把元素映射到一个存储位置,这样查找、插入、删除都只需要常数时间(O(1))。因为哈希表天然支持快速判断“这个元素是否存在”,所以集合能轻松保证元素不重复。你可以把哈希表想象成一个巨大的储物柜,每个元素通过哈希函数算出柜门号,直接存取。
核心操作:增删查与去重
- 增加元素:用
add(e),如果元素已存在则什么也不做。 - 删除元素:用
remove(e),删除指定元素。 - 查找元素:用
contains(e)或in操作符,快速判断元素是否存在。 - 去重:把列表转换成集合,重复元素自动消失。例如
set([1,2,2,3])得到{1,2,3}。
集合运算:交集、并集、差集
集合支持数学上的集合运算,非常适合处理“共同好友”、“推荐系统”等场景。
- 交集:两个集合共有的元素,用
set1 & set2或set1.intersection(set2)。 - 并集:两个集合的所有元素(去重),用
set1 | set2或set1.union(set2)。 - 差集:在第一个集合但不在第二个集合中的元素,用
set1 - set2或set1.difference(set2)。
与数组、哈希表的区别与选用
| 特性 | 集合(Set) | 数组(Array/List) | 哈希表(Map/Dict) |
|---|---|---|---|
| 元素是否重复 | 否 | 是 | 键不重复 |
| 是否有序 | 无序 | 有序 | 无序(通常) |
| 查找速度 | O(1) | O(n) | O(1) |
| 存储内容 | 仅元素 | 仅元素 | 键值对 |
| 典型用途 | 去重、成员检查、集合运算 | 顺序存储、索引访问 | 键值映射、缓存 |
选用建议:当你只需要判断“某个东西是否存在”或“去掉重复”,用集合;当需要按顺序存储且允许重复,用数组;当需要根据键快速查找值,用哈希表。