主要的容器接口和实现类
在java.util包中,Java的容器类主要由两个接口派生出来——Collection和Map,如图2.13.1所示。(所谓接口,可以理解为一种特殊的类,其特殊性主要表现在所包含的方法都没有实现体,所以接口是不能直接拿来创建对象的。它主要提供一种规范,规定其实现类应该提供的功能,具体内容见第16章。)下面了解容器的主要接口和实现类。
图2.13.1 Java主要容器类的结构图
(1)Collection接口
Collection接口是集合结构的父接口,规定了所有集合需要提供增加、删除、遍历等基本操作。这里的“集合”是一种通称,指多个对象放在一起。Collection接口有两个常用的子接口:List和Set。
①List接口
List采用线性列表的数据结构,主要特点为:元素是有序的,可以根据索引来查找;元素允许重复;元素可以为空值null。默认按照元素加入的顺序设置元素的索引。
注意:
·加入列表的时候,元素必须连续地加入,不可以有间隔,否则会抛出下标越界异常。
·访问列表下标范围外的元素时,会抛出列表下标越界异常。
·输出容器对象时,会依次调用每个对象的toString方法,输出每个对象。
List接口主要的典型实现类有Array List、Linked List。
Array List类是数组列表类,是基于数组实现的列表(它具有数组的特点:在任意位置插入、删除元素都需要循环移位,效率较低;可以通过下标随机访问;按照下标顺序遍历的效率比Linked List的高)。
【代码13.5】Array List案例1
在上例中没有加入泛型,故容器中可以加入任何对象(都当作Object类型)。这样,但当从容器中取出对象时,要强制类型转换,而且不利于加入对象时的类型检查,所以,下面定义容器的时候用泛型去限定容器中对象的类型。
【代码13.6】Array List案例2
Linked List类是链表类,以链表的方式实现列表(它具有链表的特点:在任意位置的插入、删除都都不需要元素移位,比Array List的效率高;它也可以按照下标随机存取,但是用下标随机存取的效率较低,用迭代器遍历比用下标遍历的效率高)。
【代码13.7】Linked List案例
(2)Set接口
Set就是数据结构中特指的“集合”,主要特点为:元素没有特定顺序;不允许元素重复;只能根据元素本身的值来查询。
Set接口主要的典型实现类有HashSet(哈希集合类)。
利用哈希算法来存储容器中的元素具有较好的存取和查询性能。〔当插入一个新元素时,调用该对象的hash Code()方法得到该对象的hash Code值,根据hash Code值决定元素在容器中的存储位置。〕
【代码13.8】HashSet案例
代码13.8的运行结果(重复元素不能成功插入):
(2)Map接口
Map接口用来保存有映射关系的键值对(key-value),key是不允许重复的,可以根据key来查询对应的value。
Map接口主要的典型实现类有Hash Map。Hash Map如13.2节所述。