Java集合体系

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

支持多阶段的并发控制器,用于协调多个线程的执行,适合在复杂的多线程场景中进行线程同步

  • 6
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值