Java集合体系结构
在编程时,往往需要我们集中存放多个数据,之前我们习惯于使用数组来保存多个对象,但由于数组长度固定,一旦在初始化数组时指定了数组的长度,那么这个数组的长度就不能再改变。当需要保存数量变化的数据时,数组就不能再满足我们的需求。于是Java为我们提供了集合类。
集合类的分类方法有很多,既可以按照其中元素的类型进行分类,也可以按应用在集合元素上的方法进行分类,常见的集合类有:
List集合:这是一组有序元素的集合,可以使用索引或顺序访问其中的元素。也称之为线性表。
Set集合:这是一组无序元素的集合,集合中的元素不允许重复。
Map集合:这是一组存放<键,值>对元素的集合,每个元素都由一个唯一的键和相对应的值组成。这些键不允许重复,但值可以重复。也称之为映射。
集合类也可分为两种体系,一种是Collection接口的对象的集合,又称单列集合;另一种是Map接口的键值对的集合,也称双列集合。如下图所示。
Collection是最基本的集合接口,一个Collection代表一组Object,即Collection的元素(Elements)。一些Collection允许相同的元素而另一些不行。一些能排序而另一些不行。Java SDK不提供直接继承自Collection的类,Java SDK提供的类都是继承自Collection的“子接口”如List和Set。
所有实现Collection接口的类都必须提供两个标准的构造函数:无参数的构造函数用于创建一个空的Collection,有一个Collection参数的构造函数用于创建一个新的Collection,这个新的Collection与传入的Collection有相同的元素。后一个构造函数允许用户复制一个Collection。
如何遍历Collection中的每一个元素?不论Collection的实际类型如何,它都支持一个iterator()的方法,又称迭代器。该方法返回一个迭代子,使用该迭代子即可逐一访问Collection中每一个元素。
Iterator,也称之为迭代器,是一种允许用户以顺序方式高效访问集合元素的一种特殊对象。使用迭代器可以简化遍历集合元素的过程。
Java定义了Iterator接口,描述了在遍历元素时所需要使用的方法。而具体Iterator接口的实现则由各集合类根据自身结构特点来完成,对于用户来说不需要了解Iterator的实现原理,只要获得相关集合的Iterator对象,就可以方便地进行数据遍历。
Iterator接口的定义很简单,只提供了2个方法:hasNext()方法和next()方法。通过hasNext()方法判断是否遍历到集合的最后一个元素;利用next()方法返回迭代器指向的下一个元素。
Java提供的ListIterator接口扩展了Iterator接口的功能,定义了逆向遍历的方法,实现List接口的类均实现了ListIterator迭代器。
集合类对Iterator迭代器的使用很容易,只需要相关集合对象调用Iterator()方法就可以得到当前集合的迭代器对象。
典型的用法如下所示。
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class Example {
public static void main(String[] args) {
//创建一个ArrayList集合
List<String> list = new ArrayList<String>();
list.add("星期一");
list.add("星期二");
list.add("星期三");
list.add("星期四");
list.add("星期五");
list.add("星期六");
list.add("星期日");
//使用迭代器遍历ArrayList集合
Iterator<String> listIt = list.iterator();
while (listIt.hasNext()) {
System.out.println(listIt.next());
}
}
}
运行结果如下