怎么区分 List、Set、Map 三大接口的存储特征及其在不同场景下的选型准则

浅静君_7672

浅静君_7672

2026-04-28

1019人浏览

原创

list有序、允许重复、单值;set无序(或按规则排序)、元素唯一、单值;map无序(或按键排序)、键唯一、键值对。选型依业务需求:需索引操作选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 是数量
PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
硬盘接口类型介绍
硬盘接口类型介绍

硬盘接口类型有IDE、SATA、SCSI、Fibre Channel、USB、eSATA、mSATA、PCIe等等。详细介绍:1、IDE接口是一种并行接口,主要用于连接硬盘和光驱等设备,它主要有两种类型:ATA和ATAPI,IDE接口已经逐渐被SATA接口;2、SATA接口是一种串行接口,相较于IDE接口,它具有更高的传输速度、更低的功耗和更小的体积;3、SCSI接口等等。

2023.10.19

3068

3

PHP接口编写教程
PHP接口编写教程

本专题整合了PHP接口编写教程,阅读专题下面的文章了解更多详细内容。

2025.10.17

4429

12

php8.4实现接口限流的教程
php8.4实现接口限流的教程

PHP8.4本身不内置限流功能,需借助Redis(令牌桶)或Swoole(漏桶)实现;文件锁因I/O瓶颈、无跨机共享、秒级精度等缺陷不适用高并发场景。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2025.12.29

3709

9

java接口相关教程
java接口相关教程

本专题整合了java接口相关内容,阅读专题下面的文章了解更多详细内容。

2026.01.19

386

15

golang map内存释放
golang map内存释放

本专题整合了golang map内存相关教程,阅读专题下面的文章了解更多相关内容。

2025.09.05

470

5

golang map相关教程
golang map相关教程

本专题整合了golang map相关教程,阅读专题下面的文章了解更多详细内容。

2025.11.16

323

7

golang map原理
golang map原理

本专题整合了golang map相关内容,阅读专题下面的文章了解更多详细内容。

2025.11.17

493

20

java判断map相关教程
java判断map相关教程

本专题整合了java判断map相关教程,阅读专题下面的文章了解更多详细内容。

2025.11.27

263

6

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
热门推荐
/
最新课程
phpStudy极速入门视频教程
phpStudy极速入门视频教程

共6课时 | 54.6万人学习

独孤九贱(4)_PHP视频教程
独孤九贱(4)_PHP视频教程

共89课时 | 133.4万人学习