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)无界或有界阻塞队列
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值