当前位置: 首页 > news >正文

List、Set 和 Map 的区别及常见实现类、线程安全集合(总结图表)

ListSet 和 Map 的区别

特性ListSetMap
元素顺序有序无序(部分实现有序)无序(部分实现有序)
元素唯一性允许重复不允许重复键唯一,值可重复
访问方式通过索引通过元素本身通过键
常见实现ArrayListLinkedListHashSetTreeSetHashMapTreeMap
底层数据结构动态数组、双向链表哈希表、红黑树哈希表、红黑树
适用场景需要顺序或索引访问需要去重或快速查找需要键值对映射

ListSet 和 Map 的常见实现类及其底层数据结构


1. List(列表)

实现类底层数据结构特点
ArrayList动态数组- 基于数组实现,支持随机访问。
- 插入和删除效率较低(需要移动元素)。
LinkedList双向链表- 基于链表实现,插入和删除效率高。
- 随机访问效率低(需要遍历链表)。
Vector动态数组(线程安全)- 类似 ArrayList,但线程安全。
- 性能较低,通常不推荐使用。

2. Set(集合)

实现类底层数据结构特点
HashSet哈希表(基于 HashMap)- 基于哈希表实现,插入、删除和查找效率高(平均 O(1))。
- 无序。
LinkedHashSet哈希表 + 双向链表- 在 HashSet 基础上维护插入顺序。
- 插入和查找效率接近 HashSet
TreeSet红黑树- 基于红黑树实现,元素按自然顺序或自定义顺序排序。
- 插入、删除和查找效率为 O(log n)。

3. Map(映射)

实现类底层数据结构特点
HashMap哈希表- 基于哈希表实现,插入、删除和查找效率高(平均 O(1))。
- 无序。
LinkedHashMap哈希表 + 双向链表- 在 HashMap 基础上维护插入顺序或访问顺序。
- 插入和查找效率接近 HashMap
TreeMap红黑树- 基于红黑树实现,键按自然顺序或自定义顺序排序。
- 插入、删除和查找效率为 O(log n)。
Hashtable哈希表(线程安全)- 类似 HashMap,但线程安全。
- 性能较低,通常不推荐使用。

常见的线程安全集合类及其底层数据结构和线程安全实现方式

1. List(列表)

实现类底层数据结构线程安全实现方式
Vector动态数组使用 synchronized 关键字修饰方法,保证线程安全。
Collections.synchronizedList基于传入的 List使用同步包装器,对所有方法加 synchronized 锁。
CopyOnWriteArrayList动态数组使用写时复制(Copy-On-Write)技术,读操作无锁,写操作复制新数组。

2. Set(集合)

实现类底层数据结构线程安全实现方式
Collections.synchronizedSet基于传入的 Set使用同步包装器,对所有方法加 synchronized 锁。
CopyOnWriteArraySet动态数组基于 CopyOnWriteArrayList,使用写时复制技术。

3. Map(映射)

实现类底层数据结构线程安全实现方式
Hashtable哈希表使用 synchronized 关键字修饰方法,保证线程安全。
Collections.synchronizedMap基于传入的 Map使用同步包装器,对所有方法加 synchronized 锁。
ConcurrentHashMap哈希表(分段锁)使用分段锁(JDK 7)或 CAS + synchronized(JDK 8+)。

4. Queue(队列)

实现类底层数据结构线程安全实现方式
BlockingQueue(接口)数组或链表使用锁和条件变量实现线程安全。
ArrayBlockingQueue数组使用 ReentrantLock 和 Condition 实现线程安全。
LinkedBlockingQueue链表使用两把锁(putLock 和 takeLock)提高并发性能。
ConcurrentLinkedQueue链表使用 CAS(Compare-And-Swap)实现无锁线程安全。

5. 总结对比

实现类底层数据结构线程安全实现方式适用场景
Vector动态数组synchronized 方法锁已过时,不推荐使用
Hashtable哈希表synchronized 方法锁已过时,不推荐使用
Collections.synchronizedXxx基于传入的集合synchronized 方法锁简单场景,性能要求不高
CopyOnWriteArrayList动态数组写时复制(Copy-On-Write)读多写少的场景
CopyOnWriteArraySet动态数组写时复制(Copy-On-Write)读多写少的场景
ConcurrentHashMap哈希表分段锁(JDK 7)或 CAS(JDK 8+)高并发场景
ConcurrentLinkedQueue链表CAS高并发队列场景
ArrayBlockingQueue数组ReentrantLock + Condition有界阻塞队列
LinkedBlockingQueue链表两把锁(putLock 和 takeLock)无界或有界阻塞队列

相关文章:

  • 【正点原子K210连载】第七十六章 音频FFT实验 摘自【正点原子】DNK210使用指南-CanMV版指南
  • 自学python——第二天:)
  • AI大模型交付业务起势,亚信科技书写AI时代的转型样本
  • 游戏引擎学习第170天
  • 数据结构中的引用管理对象体系
  • ESP8266 与 ARM7 接口-LPC2148 创建 Web 服务器以控制 LED
  • Starrocks 命令 Alter table DISTRIBUTED 重分布数据的实现
  • 2025年全国铁路线路及站点(矢量shp数据)
  • C++多线程
  • 设计模式之代理模式:原理、实现与应用
  • IntelliJ IDEA新建文件配置作者信息、日期和描述等
  • FSC森林认证证书应用场景
  • python 数据可视化matplotib库安装与使用
  • 如何破解集运企业的劳动密集型困局,提高人效?
  • 10、STL中的unordered_map使用方法
  • Docker 离线安装教程
  • 2025-gazebo配置on vmware,wsl
  • 【练习】PAT 乙 1081 检查密码
  • 【Golang那些事】go1.22和1.23 更新重点及测评
  • nginx性能优化有哪些方式?
  • 受美关税影响,本田预计新财年净利下降七成,并推迟加拿大建厂计划
  • 三亚通报救护车省外拉警报器开道旅游:违规违法,责令公司停业整顿
  • 福建厦门市副市长、市公安局局长陈育煌出任吉林省公安厅厅长
  • 反制美国钢铝关税!印度拟对美国部分商品征收关税
  • 外交部:中方愿根据当事方意愿,为化解乌克兰危机发挥建设性作用
  • 瑞士联邦主席凯勒-祖特尔、联邦副主席帕姆兰会见何立峰