摘要
 本文主要介绍集合的整体概念,并作为接下来Java集合实现类讲解的索引。
图示
 这是在网上看到了这样一张图,感觉很清晰,内容也很全面,我决定按这张图,把自己熟悉的集合都仔细研究一下。

各位置描述
| 位置 | 描述 | 
|---|---|
| 左上灰色部分 | 已经过期,以后的开发中不要使用。 | 
| 右上浅粉色部分 | 接口关系图 | 
| 中间绿色部分 | java.util包里集合具体实现类 | 
| 右下灰色部分 | java.util.concurrent包里面的类,用来处理java并发问题 | 
集合分类
| 分类 | 描述 | 
|---|---|
| Map | 双链集合,允许通过键来找到值 | 
| List | 按照插入顺序保存元素 | 
| Set | 不允许有重复元素 | 
| Queue | 从一端插入元素,从另一端获取 | 
实现类
| 接口 | 实现类 | 
|---|---|
| List | ArrayList、LinkedList | 
| Set | HashSet、LinkedHashSet、TreeSet | 
| Queue | PriorityQueue、LinkedList | 
| Map | HashMap、LinkedHashMap、TreeMap、WeakHashMap、IdentityHashMap | 
底层数据结构
| 底层数据结构 | 实现类 | 
|---|---|
| 数组 | EnumMap、ArrayList、ArrayQueue | 
| 链表 | LinkedHashSet、LinkedList、LinkedHashMap | 
| 红黑树 | TreeMap、TreeSet | 
| 二叉堆 | PriorityQueue | 
| 哈希表 | HashMap、HashSet、LinkedHashMap、LinkedHashSet、WeakHashMap、IdentityHashMap | 
正文
一、集合的由来
 如果一个程序只包含固定数量且生命周期都是已知的对象,那么这是一个非常简单的程序
 为了满足常规的编程需要,我们要求能在任何时候,任何地点创建任意数量,甚至是不同类型的对象,由于数组只能装统一类型数据,而且长度固定,于是产生了集合。
二、集合特点
- 集合只能存放对象。基本数据类型会自动装箱为包装类。
 - 集合存放的是对象的引用,对象本身还是放在堆内存中。
 - 集合可以存放不同类型,不限数量的数据类型。
 
三、迭代器
 使用集合必须对具体实现类进行操作,但是考虑如下状况:如果原本是对List进行编程,现在要把相同的代码用在Set上,如果能不关心容器类型只关心对集合得操作该怎么办?于是,迭代器因此产生。
 迭代器是一个对象,它的工作就是遍历并选择序列中的对象,而且客户端不需要关注序列的底层结构,Java中Iterator只能单向移动,但是其子接口ListIterator可以双向移动。
        Iterator中有hashNext(),next(),remove()几个方法,ListIterator在它的基础上又添加了三种方法,分别是 add(),previous(),hasPrevious()。
        Collection顶层结构接口是Iterable,而Map的顶层接口是Map,Collection下的集合都可以用迭代器遍历,Map可以使用Set<Map.Entry<K, V>> entrySet()方法转换为Set进行迭代遍历。
         Iterable中包含Iterator<T> iterator()方法,Collection下集合使用该方法后会返回迭代器,可对迭代器进行迭代遍历。
     通常来讲有序的集合中有Iterator<T> iterator()和ListIterator<E> listIterator()方法,可以进行双向遍历,无序的集合中有Iterator<T> iterator(),只能向后遍历。
四、实现自己的集合
 如果想实现自己的集合可以JDK提供的抽象类,如AbstractList,AbstractMap,通常这些抽象类已经为我们提供了现成的实现,可以根据需要对特定的抽象方法重写,直接实现List、Map这样的接口是需要实现所有方法工作量过大。
 不过通常来讲,java已经提供提供了丰富的集合实现,很少会需要我们自己去实现集合。
本文参考: