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时间。 并发包中的集合类都是用这种机制。