java常用集合

Collection

|  ├AbstractCollection 对Collection接口的最小化抽象实现

|  │

|  ├List 有序集合

|  │-├AbstractList 有序集合的最小化抽象实现

|  │-├ArrayList 基于数组实现的有序集合

|  │-├LinkedList 基于链表实现的有序集合

|  │-├CopyOnWriteArrayList 写时复制有序集合 线程安全

|  │-└Vector 矢量队列

|  │ └Stack 栈,先进后出

|  │

|  ├Set 不重复集合

|  │├AbstractSet 不重复集合的最小化抽象实现

|  │├HashSet 基于hash实现的不重复集合,无序

|  │├LinkedHashSet 基于hash实现的不重复集合,有序

|  │├CopyOnWriteArraySet 基于CopyOnWriteArrayList实现的不重复集合,有序,线程安全

|  │└SortedSet 可排序不重复集合

|  │ └NavigableSet 可导航搜索的不重复集合

|  │ └TreeSet 基于红黑树实现的可排序不重复集合

|  │

|  ├Queue 队列

|  │├AbstractQueue 队列的核心实现

|  │├BlockingQueue 阻塞队列

|  │└Deque 可两端操作线性集合

|

Map 键值映射集合 (key不可重复,value可以重复)

|  ├AbstractMap 键值映射集合最小化抽象实现

|  ├Hashtable 基于哈希表实现的键值映射集合,key、value均不可为null

|  ├HashMap 类似Hashtable,但方法不同步,key、value可为null

|   └LinkedHashMap 根据插入顺序实现的键值映射集合

|  ├IdentityHashMap 基于哈希表实现的键值映射集合,两个key引用相等==,认为是同一个key

|  ├SortedMap 可排序键值映射集合

|  ├ConcurrentHashMap 线程安全键值映射集合,底层使用hash实现

|  ├ConcurrentSkipListMap 线程安全键值映射集合,底层使用跳表实现
├TreeMap

|   └NavigableMap 可导航搜索的键值映射集合

|  └WeakHashMap 弱引用建,不阻塞被垃圾回收器回收,key回收后自动移除键值对

在这里插入图片描述

 

集合之间可以比较的点:

1 有序、无序
2 可以重复、不可重复
3 键、值是否可为null
4 底层实现的数据结构(数组、链表、hash、红黑树)
5 是否线程安全线

 

 

fail-fast和fail-safe概念:

 

1.fail-fast: 
集合中有一个变量modCount,代表当前集中元素数量(实时变化);
从集合获取的迭代器中也有一个变量modCount,记录生成迭代器时集合中的元素数量;
遍历迭代器时,每次循环都会检测迭代器中的modCount和集合中的modCount是否一致,不一致的话,就抛出ConcurrentModificationException异常;
这个就叫快速失败,为了防止并发修改,保证遍历过程中,没有其他线程修改该集合(其实如果其他线程新增了一个元素,又删除了一个元素,等该迭代器下次检测时候,认为没有被修改过,
因为两个数字还是一样的,这种也属于ABA问题,至于ABA问题是否会引起业务错误,那要看具体问题了)。

除了并发包的类,其他集合类,都是fail-fast模式

2.fail-safe:
遍历集合时,从当前集合拷贝一个副本(或者快照),在安全的副本(或者没有提供修改一操作的正本)上进行遍历,
集合修改和副本的遍历时没有任何关系的;
但是缺点很明显,就是读取不到最新数据,这就是CAP理论中C(Consistency)和A(Availability)的矛盾,即一致性和可用性的矛盾;
在副本上遍历的数据,可能不是集合中最新的数据,复制副本时,也需要额外的内存和CPU时间。

并发包中的集合类都是用这种机制。

 

posted @ 2022-02-28 14:04  高压锅里的大萝卜  阅读(52)  评论(0编辑  收藏  举报