list有序、允许重复、单值;set无序(或按规则排序)、元素唯一、单值;map无序(或按键排序)、键唯一、键值对。选型依业务需求:需索引操作选list,需去重选set,需键值查找选map。

区分 List、Set、Map 的核心,是抓住三点:元素是否有序、是否允许重复、数据结构维度(单值还是键值对)。选型不是背概念,而是看业务要什么——要按顺序查第几个?要自动去重?还是要通过名字找数据?
List:按位置存取,允许重复,强调“顺序”和“索引”
它像一张带编号的清单,每个元素有明确下标(0、1、2…),支持 add(index, e)、get(i)、set(i, e) 等操作。
- 适合场景:需要遍历顺序与插入顺序一致;需频繁根据下标读写;允许相同内容多次出现(比如日志列表、购物车商品、历史搜索记录)
- 常见实现:ArrayList(读多写少,随机访问快);LinkedList(增删频繁,尤其首尾操作多)
- 注意点:可存多个 null;不保证线程安全;Vector 虽线程安全但已基本被替代
Set:唯一性优先,不强调位置,关注“有没有”
它本质是数学意义上的集合,只关心元素是否已存在,不提供索引访问。判断重复靠 equals() + hashCode()(自定义类务必重写这两个方法)。
- 适合场景:去重(如用户标签去重、URL 去重)、成员资格检查(如权限集合、黑名单校验)、需要自动排序时(用 TreeSet)
- 常见实现:HashSet(最快,无序,基于哈希表);TreeSet(自动排序,基于红黑树,要求元素可比较);LinkedHashSet(保持插入顺序,兼顾去重与顺序)
- 注意点:最多存一个 null;不能通过下标获取元素;添加重复元素会静默失败,返回 false
Map:以键为中心,解决“通过名字找东西”的问题
它不存单个值,而是存 key-value 对。Key 必须唯一且不可为 null(HashMap 允许一个 null key,但 TreeMap 不允许);value 可重复、可为 null。
- 适合场景:配置项管理(如 "timeout" → 3000)、缓存("user:1001" → User 对象)、统计计数("apple" → 5)
- 常见实现:HashMap(最常用,无序,O(1) 平均查找);TreeMap(按键排序,适合范围查询或需要遍历时有序);LinkedHashMap(保持插入/访问顺序,LRU 缓存基础)
- 注意点:key 的 equals/hashCode 必须合理;修改 key 的属性可能导致无法再 get 到对应 value(key 在 map 中定位后不应被改动)
快速选型对照表
(按你最关心的问题反向匹配)
- 我要按顺序保存,并能随时改第 3 个元素 → List
- 我只要确保不出现两个一样的手机号 → Set
- 我有一堆用户 ID,想快速拿到对应的用户名 → Map
- 我要一边加数据一边去重,还要按加入先后顺序遍历 → LinkedHashSet 或 LinkedHashMap(只用 key)
- 我要统计每种商品卖了多少件 → Map
,key 是商品名,value 是数量









