对象的聚集方式 ----集合 ,编程的过程中不可或缺的一把利剑。
这里面体现了编程的理念、数据结构和数据结构之上的算法精髓。
Java的集合框架在Java.Util包下。并发集合框架在concurent包下。
下面是所有类(接口,虚基类,实现类)之间的关系图。自己根据util包内类关系画出来的,画完以后顿时感觉之前乱糟糟的框架关系变得清晰完整起来。
A Collection
从设计上来看应该分为 接口继承和类继承。一贯的Java类体系设计风格。
接口体系从Iterable<T>继承而来,说明collection体系类是可以遍历的,都可以返回iterator遍历接口。
但是对于List来说,我们需要可以前后双向遍历。所以AbstractList类以及子类都可以返回ListIterator。
对于实现了Iterator的集合和基本数组都可以使用
for(Element e : list ){}
注意点:
1 Deque 继承自Queue接口 又封装了栈的基本操作。
双端队列提供 first 和 last 型的操作方法。所以队列、双端队列、栈的操作都可以实现。
具体实现是由LinkedList<T>来承担的。
2 内存结构有两种:连续的数组 和 不连续的链表块
3 Set实现是基于Map的Key集合来实现的。
TreeSet ---> TreeMap
HashSet ---->HashMap
LinkedHashSet --->LinkedHashMap
4 逻辑结构涉及到了
顺序列表
队列 FIFO
栈 FILO
hashTable(解决冲突数组)
树(红黑树)
堆(数组映射完全二叉树)
5 呈现形式
不重复 set
顺序 List
Key-Value对 Map
6 优先队列是采用 逻辑上小根、大根堆来实现的 数据结构上是动态数组
7 Collections 和 Arrays提供了一些排序 查找 并查集、复制等方法
B Map
Map 提供了Key-Value查找方式。
现将K-V放到一个桶里面再用不同的方式来组合。
HashMap 将桶放到解决冲突的动态数组里面,利用Key来查找桶的位置。如果冲突就以链表方式挂载,冲突超过8次,就将链表转换为红黑树。
LinkedHashMap在HashMap的基础上又维护一个LinkedList链表,用来保存数据插入或者访问顺序。
TreeMap是将桶按照Key大小插入到红黑排序树上。
C Concurrent集合类
并发框架对Queue做了很多扩展。可能和系统中队列使用场景的比较多有关。
注意点:
1 对于并发框架的阻塞队列 BlockingQueue<E>
| 抛出异常 | 特定值 | 阻塞 | 超时 |
添加元素 | add | Offer | Put | Offer(Time |
移除元素 | Remove | Poll | take | Poll(Time |
检测 | Element | peek |
|
生产者 put 如果满了就阻塞掉生产者进程 否则就通知阻塞的消费者
消费者 take 如果空了 就阻塞掉消费者进程 否则就通知阻塞的生产者
2 DelayQueue
超过时间的E出队
3 其他待续
4 对于Set Map List的扩展
D 集合框架提供的基本接口方法:
未完待续(并发框架具体详解和使用场景)