Collection 和 Map 是 Java 集合框架的根接口,这两个接口又包含了一些子接口或实现类
Collection接口:单列数据,定义了存取一组允许重复对象的方法的集合
1. List:允许存储有序的、可重复的数据
(1).ArrayList(常用子类)
1.有序,非线程安全,可为null,可重复 ,查询快,插入、删除慢、效率高。
2.底层实现Object数组,它实现了Serializable接口,因此它支持序列化。
3.默认容量为10,当数据超过当前容量会进行自动扩容,每次扩容原数组的1.5倍 。
(2) .LinkedList(常用子类)
1.有序、非线程安全,插入、删除快、查询效率不高
2.底层为双向链表
(3) .Vector(不常用)
1.有序,可重复,查询快,插入、删除慢
2.底层实现Object数组,跟ArrayList结构相似,线程安全的,加了synchronized,
3.效率低,一般不常用,在考虑到线程并发访问的情况下才会去使用Vector子类
Stack栈:先进后出(LIFO),继承自Vector,也是数组,线程安全的栈。
2. Set:无序集合,元素不可以重复
(1).HashSet(常用子类)
1.无序,唯一,允许为null,不是线程安全的,存取速度比较快,不允许保存重复元素(可以实现去重操作)
2.底层是HashMap,放到HashSet集合中的元素等同于放到HashMap集合key部分了
3.HashSet 按 Hash 算法来存储集合中的元素,因此具有很好的存取、查找、删除性能
(2).LinkedHashSet
LinkedHashSet 继承与 HashSet,并且其内部是通过 LinkedHashMap 来实现的
(3).TreeSet(常用子类)
1.有序,唯一,不重复,不允许为null主要用作排序,自然排序和定制排序,默认情况下,TreeSet 采用自然排序
2.底层是TreeMap,放到TreeSet集合中的元素等同于放到TreeMap集合key部分了,红黑树(自平衡的排序二叉树)
3. Queue队列(先进后出)
(1).ArrayDeque数组实现的双端队列,可以在队列两端插入和删除元素,数组队列,先进先出(FIFO)
(2).和LinkedList一样也是双向链表
3.Map接口
Map接口:双列数据,集合中保存具有映射关系“key-value对”的元素,访问时只能根据每项元素的 key 来访问其 value
1.HashMap
允许使用null键和null值,与HashSet一样,不保证映射的顺序
注:
JDK 7及以前版本:HashMap是数组+链表结构(即为链地址法)
JDK 8版本发布以后:HashMap是数组+链表+红黑树实现。
2.LinkedHashMap
LinkedHashMap继承了HashMap,是Map接口的哈希表和链接列表实现,它维护着一个双重链接列表,此链接列表定义了迭代顺序,该迭代顺序可以是插入顺序或者是访问顺序
3. HashTable
Hashtable和HashMap从存储结构和实现来讲有很多相似之处,不同的是它承自Dictionary类,而且是线程安全的,另外Hashtable不允许key和value为null,并发性不如ConcurrentHashMap。
4. Treemap(根据键排序)
Map集合的主要功能是依据key实现数据的查询需求,为了方便进行key排序操作提供了TreeMap集合,
TreeMap实现SortMap接口,能够把它保存的记录根据键排序,默认是按键值的升序排序(自然顺序),也可以指定排序的比较器,当用Iterator遍历TreeMap时,得到的记录是排过序的
4.JUC集合类
1. ConcurrentHashMap
(1).线程安全:多个线程可以同时进行读操作,支持高并发的写操作,通过使用分段锁(Segment)来实现并发写操作的效率
(2).分段锁设计: 内部采用了分段锁设计,将哈希表分成多个段(Segment),每个段维护着一部分键值对,不同的段之间可以独立地进行并发操作,从而实现了更高的并发性能
(3).性能优化: ConcurrentHashMap 提供了较好的性能优化,包括读操作不需 要加锁、写操作采用局部锁等优化措施,使得在高并发场景下, ConcurrentHashMap 能够提供较好的性能表现
(4).不支持 null 键和 null 值: 与 HashMap 不同,ConcurrentHashMap 不支持存储 null 键和 null 值,如果尝试存储 null 键或 null 值,会抛出 NullPointerException
(5).适用场景: 特别适合在读多写少的场景,例如缓存系统、分布式系统中的分片存储等
2.CopyOnWriteArrayList
是一个线程安全的动态数组,它的特点是在进行写操作(添加、删除、修改元素)时,会创建一个新的数组来进行操作,从而实现了多线程之间的隔离,避免了读写冲突,因此不需要显式的加锁
特点:
线程安全: CopyOnWriteArrayList 是线程安全的,可以在多线程环境下使用,无需使用额外的锁来进行保护
写时复制: 当进行写操作(添加、删除、修改元素)时,会创建一个新的数组来进行操作,而不是在原数组上直接进行操作。这意味着写操作不会影响到正在进行的读操作,从而实现了读写的并发性
高效的读操作: 由于读操作不需要加锁,且不会被写操作所阻塞,因此读操作非常高效,不会出现读取数据时的阻塞或者等待情况
适用于读多写少的场景: CopyOnWriteArrayList 适用于读多写少的场景,因为每次写操作都会创建一个新的数组,因此在写操作频繁的情况下,性能可能会受到影响
案例:
缓存管理: 在缓存管理中,多个线程可能同时读取缓存,但只有一个线程能够更新缓存。使用 CopyOnWriteArrayList 可以实现高效的读操作,而无需显式加锁
事件监听器: 在事件监听器中,多个线程可能同时注册和触发事件,但只有一个线程能够处理事件。使用 CopyOnWriteArrayList 可以实现并发注册和触发事件,而无需显式加锁
并发任务管理: 在并发任务管理中,多个线程可能同时添加、删除和查询任务,但只有一个线程能够执行任务。使用 CopyOnWriteArrayList 可以实现并发的任务管理,而无需显式加锁
3.ConcurrentLinkedQueue
是 Java 中的一种线程安全的并发队列,它基于链表实现,具有高性能的并发特
数据结构: 内部使用链表数据结构来存储元素,每个节点包含了存储的元素值以及一个指向下一个节点的引用
线程安全:通过使用一些非阻塞的并发算法来实现线程安全,避免了使用锁,从而在高并发环境下具有较好的性能
高性能: 在并发环境下表现出较好的性能,因为它避免了锁的使用,从而避免了锁带来的性能开销
无界队列: 没有容量限制,可以动态地增加或减少队列的大小
无阻塞操作: 提供了一些无阻塞的队列操作,如 offer、poll、peek 等,这些操作不会阻塞线程,具有较低的延迟
支持并发迭代
4.ConcurrentSkipListMap
1. 线程安全: ConcurrentSkipListMap 提供了线程安全的访问和更新操作,多线程环境下可以安全地进行并发操作,无需显式的加锁或解锁
2. 有序性: ConcurrentSkipListMap 内部维护了一个有序的键值对集合,支持按照键的排序进行访问和遍历,可以用作有序映射
3. 高效性: ConcurrentSkipListMap 在多线程环境下可以实现高效的并发读写操作,通过使用跳表(Skip List)的数据结构,可以在平均情况下实现 O(log n) 的时间复杂度的访问和更新操作
5.ConcurrentSkipListSet
线程安全的跳表实现的有序集合,支持高并发的读写操作,并且支持按元素排序的遍历操作
6.LinkedBlockingQueue
线程安全的有界或无界队列,支持阻塞式的队列操作,适合在多线程环境下进行生产者-消费者模式的实现
7. ArrayBlockingQueue
线程安全的有界阻塞队列,支持阻塞式的队列操作,适合在多线程环境下进行生产者-消费者模式的实现
8. SynchronousQueue
线程安全的零容量队列,支持阻塞式的队列操作,适合在多线程环境下进行同步传输数据的场景
9. Phaser
支持多阶段的并发控制器,用于协调多个线程的执行,适合在复杂的多线程场景中进行线程同步