倪升武的博客中有一个小专题,读完之后,发现博主的分析基本是基于JAVA1.7的,这里我基于JAVA1.8给出一些新的解读。但是对于JAVA1.8添加的一些新特性可能不太会作过多的分析(毕竟本人目前水平有限,且本博客的写作初衷也是以基础学习为主),在彻底浅读完JAVA1.8集合部分之前,我无法了解JAVA1.7与1.8之间关于集合框架的改动到底会有多少,因此可能产生某些个人理解上的不当,希望大家可以予以指正。

集合分类

1.Collection框架

首先是一个Collection框架图:

标注:从网上看过好多图片,分类是比较明确,但是感觉图不够醒目清晰,因此我自己又重新画了一个。有些集合类没有画出来(如Vector的子类Stack等),其他如有不当之处,敬请指正。上图中,接口我用蓝色字体矩形框标示,抽象类用橙色椭圆形框标示,最终的实体类用红色六边形标示。另外,虚线标示实现(implements),实线标示继承(extends)。

  • 从图中我们可以看出,Collection接口下共有Set、List、Queue三个子接口。由于后面我们要着重分析的是ArrayList、LinkedList、TreeSet、HashSet,因此我们不对Queue这个子接口做过多的解读。
  • List接口:List是一个有序的集合,每个元素都有索引且起始索引位置为0。
  • Set接口:Set是一个无序的集合,而且Set中不允许有重复元素。HashSet和HashMap之间、TreeSet和TreeMap之间还有依赖关系,后面我们会讲到。

2.Map框架

然后是一个Map框架图:

  • Map接口:主要用来处理映射关系的集合。其中的每一个元素都是一个键值对(Entry)。
  • AbstractMap:实现Map的一个抽象类,Map中大多数方法都实现了。
  • HashTable:由于历史原因依旧继承Directionary类,但是实现了Map接口。

3.集合框架中用到的一些类

  • Iterator是遍历集合的工具,我们通常使用Iterator迭代器来遍历集合。Collection依赖于Iterator是因为Collection的实现类都要实现iterator()方法,返回一个Iterator对象。ListIterator是专门为遍历Collection而存在的。
  • Enumeration是JDK1.0引入的抽象类,作用和Iterator一样,也是遍历集合,但是Enumeration的功能要比Iterator少,在上面的框图中,Enumeration只能在HashTable,Vector和Stack中使用。

小结:从上面的分类我们可以看出,Collection接口和Map是相互独立的接口。另外,Array和Collections是2个有用的类,其内部实现了很多静态的集合方法,Collections提供了一些列静态方法以实现对各种集合的搜索、排序、线程安全化等操作,其中大多数方法用来处理线性表。Collections类不能实例化,如同一个工具类,服务与Collection框架。若在使用Collections的方法时,对应的collection对象为null,那么会抛出NullPointerException异常。

更多推荐

JAVA常用集合框架源码解析(基于1.8)开题篇