Java集合的框架主要分两大部分,一部分实现了Collection接口,该接口定义了存取一组对象的方法,其子接口Set和List分别定义了存取方式;另一部分是Map接口,该接口定义了存储一组“键(key)值(value)”映射对的方法。
在介绍面向对象编程课程时,我们一直使用的“租车系统”如果想存放多个轿车的信息,该如何实现呢?以大家现有的知识储备,使用数组解决这个问题是最合理的方式。但是使用数组存放“租车系统”中多个轿车的信息,也会存在很多问题。
首先,Java语言中的数组长度是固定的,一旦创建出指定长度的数组以后,就给内存分配了相应的存储空间。这样就会给程序员造成很大的困惑,如果数组长度设置小了,不能满足程序需求,如果数组长度设置大了,又会造成大量的空间浪费。
其次,如果使用长度为20的轿车对象数组来存放轿车的信息,但是实际上只存放了8辆轿车的信息,这时要获取这个数组中实际存放了多少辆轿车信息的数字,就不是数组这个数据结构自己能解决的问题了。数组只提供了length属性来获取数组的长度,而不能获取数组中实际存放有用信息的个数。
最后,数组在内存空间中是连续存放的,这样如果在数组中删除一个元素,为了保持数组内数据元素的有序性,之后的数组元素全部要前移一位,这样非常消耗系统资源。
通过上面的分析大家可以看出,使用数组虽然可以实现之前的目的,但会有诸多的麻烦。为了解决这个问题,Java语言给我们提供了集合这种类型。集合是一种逻辑结构,提供了更多的方法,让使用者更加方便。针对不同的需求,Java提供了不同的集合,解决各类问题。
JDK不提供Collection接口的任何直接实现类,而是提供了更具体的子接口(如Set接口和List接口)实现。这些Set和 List子接口继承Collection接口的方法,从而保证Collection接口具有更广泛的普遍性。Collection接口框架如图3.1所示。
图3.1 Collection接口框架
从图3.1中可以看出,Collection接口继承自Iterable接口,因为Iterable接口允许对象成为 foreach语句的目标,所以所有集合类都可以成为JDK1.5的新特性,增强for循环的目标。
Collection接口主要有三个子接口,分别是List接口、Set接口和Queue接口,下面简要介绍这三个接口。
实现List接口的集合是一个有序的 Collection序列。操作此接口的用户可以对这个序列中每个元素的位置进行精确控制,用户可以根据元素的索引访问元素。List接口中的元素是可以重复的。
- Set接口
Queue接口用于在处理元素前保存元素的Collection序列。除了具有Collection接口基本的操作外,Queue接口还提供了其他的插入、提取和检查等操作。
Map接口定义了存储和操作一组“键(key)值(value)”映射对的方法。
Map接口和Collection接口的本质区别在于,Collection接口里存放的是一个个对象,而Map接口里存放的是一系列的键值对。Map接口集合中的key不要求有序,对于一个集合里的映射对而言,不能包含重复的键,每个键最多只能映射到一个值。Map接口框架如图3.2所示。
图3.2 Map接口框架
从图3.2中可以看出,HashMap和Hashtable是实现Map接口的集合类,这两个类十分类似,在后面的章节中将会详细介绍HashMap。