学习目标:了解集合框架与Collection接口。
集合框架
不同的方法和数据结构的选取,性能会存在很大差异,如何快速搜素百万级的数据项?如何快速地实现队列的排序?如何将有用的数据加入队列,或从队列中删除无用的数据?如何建立类似地图的数据,通过地图数据就可以找到实际的地址?为解决上述问题,Java提供了一套特殊的类——集合类。
集合类的功能就是实现各种方式的数据存储,这样一组专门用来存储其它对象的类,一般被称为对象容器类,简称容器类,这组类和接口的设计结构也被统称为集合框架(Collection Framework)。
在数学概念中,集合是由一个或多个确定的元素构成的整体。具体来说是指具有某种特定性质、具体的或抽象的对象汇总成的集体,这些对象称为该集合的元素。例如,在数学概念整数集合里,数值…、-1、0、1、2…是整数集合的元素。
在Java语言中,集合是用来存储多个同种类型的数据结构。前面讲过的数组也可以存储多个同种类型的数据,与集合不同的是,数组存储数据元素的个数是固定的,而集合长度是可以动态改变的,也可以把集合理解为能够动态改变长度的数组。
数组有插入、删除、修改、查询操作,集合同样也有插入、删除、修改、查询操作。在学习使用一个具体的集合类时,只要把这四个操作弄清楚了,基本上就可以说掌握这个集合类了。
框架定义了一套规范,用来定义、操作集合类,使具体操作与实现细节解耦。Java语言的设计者对常用的数据结构和算法做了一些规范(接口)和实现(具体实现接口的类)。所有抽象出来的数据结构和操作(算法)统称为Java集合框架(CollectionFramework)。Java集合框架实现了常用的基本数据结构,如:集合、线性表、队列、栈、映射表等。
Java程序员在具体应用时,不必考虑数据结构和算法实现细节,只需要用这些类创建出来一些对象,然后直接应用就可以了,这样就大大提高了编程效率。
在集合框架的类继承体系中,最顶层有两个接口:
Collection
表示一组纯数据。
Map
表示一组key-value对。
集合类继承或实现这两个接口时,一般需要提供两个“标准”的构造函数,分别是:
(1)没有参数的构造函数,创建一个空的集合类。
(2)有一个类型与基类(Collection或Map)相同的构造函数,创建一个与给定参数具有相同元素的新集合类。
集合框架中容器类的关系如下图所示:

Java集合框架主要由Collection接口和Map接口构成,Collection接口有子接口List、Set、Queue接口。常用的集合类有:ArrayList、LinkedList、HashSet、TreeSet、HashMap、TreeMap等,还有一些遗留的早期版本的集合类,如:Vector、Stack、HashTable等。
Java集合框架,为我们提供了一套性能优良、使用方便的接口和类。就像我们已经发明了汽车,只需要学会如何使用它们,就可以处理实际应用当中出现的问题了。
Java集合类大致分为Set、List和Map三大接口。Java集合就像一种容器,可以通过相应的方法将多个对象的引用放入容器中。
Collection接口
Collection接口作为集合的一个根接口,它提供了对集合对象进行基本操作的通用接口方法,接口在Java 类库中有很多具体的实现。其意义是为各种具体的集合提供了最大化的统一操作方式。
JDK不提供此接口的任何直接实现,而是提供更具体的子接口,具体有Set接口、List接口、Queue接口。Set接口存放的元素是无序的且不包含重复元素(对象);List接口存放的元素是有序的且允许有重复的元素;Queue接口存放的元素顺序符合先入先出的规则,和我们日常生活中的排队模型很类似。Collection接口层次如下图所示:

Collection接口定义了一组对象和它的子类需要实现的 15 个方法,下面分类列出并说明。
1、容器类中添加、删除的操作方法
● boolean add(Object obj)
将Object对象添加到collection。
● boolean remove(Object obj)
如果collection中有与obj相匹配的对象,则删除该对象。
2、容器类中元素查询的操作方法
● int size()
返回当前集合中元素的数量。
● boolean isEmpty()
从当前collection中查询是否包含元素。
● boolean contains(Object obj)
查找此collection是否包含指定的元素。
● boolean contains(Collection collec)
判断此Collection是否包含指定Collection中所有元素。
● Iterator iterator ()
返回此Collection上的迭代器,用来访问该Collection中各个元素。
● boolean contains All(Collection collec)
判断Collection是否含有collec中的所有元素。
3、容器类中的组操作方法
● boolean addAll(Collection collec)
将指定的collec中的所有元素添加到当前Collection。
● void clear()
删除当前Collection中的所有元素。
● void removeAll(Collection collec)
从当前Collection中删除collec中的所有元素。
● void retainAll(Collection collec)
从当前Collection中删除collec中不包含的元素。
4、转换操作,用于集合与数组间的转换
● Object[] toArray()
将当前Collection转成对象数组
● Object[] toArray(Object[] a)
返回一个内含当前Collection所有元素的array。
在Collection中并未提供get()方法获取元素。如果要遍历Collection中的元素,一般要采用Iterator迭代器,可以通过Iterator迭代器遍历Collection各个对象元素。
5、Iterator接口(迭代器)中定义的方法如下:
● Iterator Iterator ()
返回集合的迭代器,用于遍历集合中对象。
● boolean hasNext()
判断当前迭代器是否有下一个元素。
● Object next()
返回当前迭代器指向的对象元素,并指向下一个对象元素
● void remove()
删除当前迭代器所指向的元素,一般和next方法一起用,这时候的作用就是删除next方法返回的元素。
Collection是接口类,不能实例化为对象,但可以实例化Collection接口的实现类,并把实现类的对象引用向上转型为Collection接口类型。
例如:
Collection list = new ArrayList();
在上面的例句中,ArrayList是Collection接口的实现类,代码将ArrayList的实例化对象赋值给Collection接口类型的变量list,此时可以使用list来存储继承于Object类的实例化对象。
案例1:建立CollectionTest类,实例化ArrayList对象,并将对象引用赋值给Collection类型的list变量,此时的list变量的值指向ArrayList的对象引用,因此list变量也可以称为list集合,使用list集合添加String对象,最后输出list集合中的String对象。
新建项目PUnit10,在PUnit0项目新建collection包,在collection包下新建CollectionTest类。代码如下:
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
public class CollectionTest {
public static void main(String[] args) {
// 实例化ArrayList对象
Collection list = new ArrayList();
// 添加String对象到list集合
list.add("编程语言");
list.add("java");
list.add("Python");
// 获取list集合的迭代器
Iterator iterator = list.iterator();
// 使用while循环迭代集合中对象
while (iterator.hasNext()) {
String str = (String)iterator.next();
System.out.println(str);
}
}
}
CollectionTest类的main方法中声明了Collection类型的list变量,实例化的ArrayList集合对象向上转型并赋值给list,list集合先后添加三个String对象。最后用Iterator迭代器遍历集合存储的所有String对象。集合中的对象类型都为Object类型,从集合中取得对象,必须把它转换成原来的类型。
Collection接口、ArrayList类、Iterator类都在APL库java.util包内,需要使用import语句导入这三个类。