导语:我们平时编程使用过很多的JDK工具类,但是学习不能知其然不知所以然,不看源码和了解底层实现机制的话经常会踩坑,对于越是底层的东西的了解程度可以反映一个程序员的编程水平,最近开始阅读JDK源码学习JDK设计的精髓,对于编程水平提升是非常具有价值的
集合框架简介
java的集合框架定义了对集合操作的方法,框架集合代表了对于集合的增删改查定义了一套完整的规范,使得使用具体操作与实现进行解耦。主要理念用一句话概括就是:提供一套“小而美”的API。API需要对程序员友好,增加新功能时能让程序员们快速上手。
下面我们先从整体上对于Java分析集合框架的结构:
- 实线边框的是具体实现类,如ArrayList、LinkedList、HashMap等,折线边框的是抽象类,如AbstractCollection、AbstractList、AbstractMap等,而点线边框的是接口,如Collection、Iterator、List等。
- 所有的集合类都会实现iterator方法获得集合的Iterator对象,Iterator提供遍历集合元素的接口,主要包含hashNext、next、remove三种方法。它的一个子接口LinkedIterator在它的基础上又添加了几种方法,分别是add、previous、hasPrevious、nextIndex、previousIndex、remove、set等方法。
- 一般元素无序的集合类都实现Iterator接口,在遍历集合元素的时候,集合只能向后遍历,被遍历过的元素不会再被遍历到,如HashSet和HashMap;而那些元素有序的集合类一般实现LinkedIterator接口,实现该接口的集合可以双向遍历,既可以通过previous方法访问前一个元素,也可以通过next方法访问后一个元素,如LinkedList;
- 集合类实现一般都会继承抽象类。抽象类一般都提供了许多基础方法的实现,在实现具体集合类时只需要重写或添加部分方法即可实现,减少了开发工作。
两大基类Collection与Map
集合类最上层的两个接口:
- Collection表示一组纯数据
- Map表示一组key-value对
Collections
List
List集合代表一个元素有序、可重复的集合,集合中每个元素都有其对应的顺序索引。List集合允许加入重复元素,
因为它可以通过索引来访问指定位置的集合元素。List集合默认按元素的添加顺序设置元素的索引。
Set
Set表示不允许有重复元素的集合(A collection that contains no duplicate elements)
Queue
JDK1.5新增,与上面两个集合类主要是的区分在于Queue主要用于存储数据,而不是处理数据。(A collection designed for holding elements prior to processing.)
Queue用于模拟“队列”这种数据结构(先进先出 FIFO)。队列的头部保存着队列中存放时间最长的元素,队列的尾部保存着队列中存放时间最短的元素。新元素插入(offer)到队列的尾部,访问元素(poll)操作会返回队列头部的元素,队列不允许随机访问队列中的元素。
Map
Map用于保存具有映射关系的数据,因此Map集合里保存着两组值,一组值用于保存Map里的key,另外一组值用于保存Map里的value。key和value都可以是任何引用类型的数据。Map的key不允许重复,即同一个Map对象的任何两个key通过equals方法比较结果总是返回false。
关于Map,从代码复用的角度去理解,java是先实现了Map,然后通过包装了一个所有value都为null的Map就实现了Set集合。Map的这些实现类和子接口中key集的存储形式和Set集合完全相同(即key不能重复) 。Map的这些实现类和子接口中value集的存储形式和List非常类似(即value可以重复、根据索引来查找)。
从整体上了解了集合框架构成后,后续会在系列文章中分别对常用的结合源码进行深度剖析。