Java的java.util包中提供了很多工具方法,其中最重要的是java的集合框架,其中Collection是集合框架的根接口。该接口提供了集合框架最基础的操作规范,如:现在元素、移除元素、获取元素等方法。下图为Collection的整体继承关系图:
其中接口简介:
Iterable接口
实现这个接口的类的对象允许使用"for each"语句进行迭代。该接口只定义了一个iterator方法,该方法返回一个迭代器(Iterator)。源码如下:public interface Iterable {
/**
* Returns an iterator over a set of elements of type T.
* @return an Iterator.
*/
Iterator iterator();
}
Collection接口
该接口是java集合层次结构中的根接口。集合表示一组对象(对象可以类型不同,但是不建议这么做),这些对象也称为集合的元素。有一些集合类允许有重复的元素,而另一些则不允许。有一些集合类是有序的,而另一些则是无序的。java不提供此接口的任何直接实现,则是提供更具体的子接口(如 Set 和 List)的实现。
所有通用的集合实现类应该提供两个“标准”构造方法:
1、一个无参数的构造方法,用于创建空 collection。
2、一个是只带有一个Collection类型参数的构造方法,用于创建一个具有与其参数相同元素新的集合。
实际上,后者允许用户复制任何集合,以生成所需实现类型的一个等效的集合。尽管无法强制执行此约定,但是Java平台库中所有通用的集合实现都遵从它。
下面是Collection的源码:public interface Collection extends Iterable {
// 返回大小
int size();
// 判断集合是否为空
boolean isEmpty();
// 判断是否存在指定元素
boolean contains(Object o);
// 获取迭代器
Iterator iterator();
// 转换成指定类型的数组
T[] toArray(T[] a);
// 向集中添加一个元素
boolean add(E e);
// 从集合中移除一个元素
boolean remove(Object o);
// 查看集合是否包含一批元素
boolean containsAll(Collection> c);
// 向集合中添加一批元素
boolean addAll(Collection extends E> c);
// 从集合中移除一批元素
boolean removeAll(Collection> c);
// 从集合中移除不在c集合中的所有元素
boolean retainAll(Collection> c);
// 清空集合中的元素
void clear();
// 比较两个集合是否相等
boolean equals(Object o);
// 返回此 collection 的哈希码值
int hashCode();
}
List接口
有序的集合(也称为序列)。此接口的用户可以对列表中每个元素的插入位置进行精确地控制。用户可以根据元素的整数索引访问元素,并搜索列表中的元素。
与set不同,列表通常允许重复的元素。更确切地讲,列表通常允许满足 e1.equals(e2) 的元素对 e1 和 e2,并且如果列表本身允许 null 元素的话,通常它们允许多个 null 元素。难免有人希望通过在用户尝试插入重复元素时抛出运行时异常的方法来禁止重复的列表,但我们希望这种用法越少越好。
注意:尽管列表允许把自身作为元素包含在内,但建议要特别小心:在这样的列表上,equals 和 hashCode 方法不再是定义良好的。
Queue接口
在处理元素前用于保存元素的集合。除了基本的 Collection 操作外,队列还提供其他的插入、提取和检查操作。每个方法都存在两种形式:一种抛出异常(操作失败时),另一种返回一个特殊值(null 或 false,具体取决于操作)。插入操作的后一种形式是用于专门为有容量限制的 Queue 实现设计的;在大多数实现中,插入操作不会失败。
队列通常(但并非一定)以 FIFO(先进先出)的方式排序各个元素。不过优先级队列和 LIFO 队列(或堆栈)例外,前者根据提供的比较器或元素的自然顺序对元素进行排序,后者按 LIFO(后进先出)的方式对元素进行排序。无论使用哪种排序方式,队列的头都是调用remove()或poll()所移除的元素。在 FIFO 队列中,所有的新元素都插入队列的末尾。其他种类的队列可能使用不同的元素放置规则。每个 Queue 实现必须指定其顺序属性。
Dque接口
一个线性 collection,支持在两端插入和移除元素。名称 deque 是“double ended queue(双端队列)”的缩写,通常读为“deck”。大多数 Deque 实现对于它们能够包含的元素数没有固定限制,但此接口既支持有容量限制的双端队列,也支持没有固定大小限制的双端队列。
Set接口
一个不包含重复元素的集合框架。更确切地讲,set不包含满足e1.equals(e2)的元素对e1和e2,并且最多包含一个 null元素。正如其名称所暗示的,此接口模仿了数学上的set抽象。
SortedSet接口
这个接口继承了Set接口,该接口提供了排序、对集合升序或降序遍历的方式
提供关于元素的总体排序的Set。这些元素使用其自然顺序进行排序,或者根据通常在创建有序Set时提供的Comparator进行排序。该set的迭代器将按元素升序遍历set。提供了一些附加的操作来利用这种排序。
插入有序set的所有元素都必须实现 Comparable接口(或者被指定的比较器所接受)。另外,所有这些元素都必须是可互相比较的:对于有序set中的任意两个元素e1和e2,执行e1.compareTo(e2)(或 comparator.compare(e1, e2))都不得抛出 ClassCastException。试图违反此限制将导致违反规则的方法或者构造方法调用抛出 ClassCastException。
NavigableSet接口
该接口是对SortedSet的扩展,提供了更多的搜索方法,如:搜索大于等某个元素的所有元素、小于等于某个元素的所有元素等等搜索方法。更详细的说明请参考API。源代码如下:public interface NavigableSet extends SortedSet {
// 返回集合中小于给定元素的最大元素;如果不存在,则返回null
E lower(E e);
// 返回集合中小于等于给定元素的最大元素;如果不存在,则返回null
E floor(E e);
// 返回集合中大于等于给定元素的最小元素;如果不存在,则返回null
E ceiling(E e);
// 返回集合中大于给定元素的最小元素;如果不存在,则返回null
E higher(E e);
// 获取并移除第一个(最低)元素;如果此集合为空,则返回null。
E pollFirst();
// 获取并移除最后一个(最高)元素;如果此集合为空,则返回null。
E pollLast();
// 返回一个迭代器
Iterator iterator();
// 返回此集合中所包含元素的逆序视图
NavigableSet descendingSet();
// 以降序返回在此集合的元素上进行迭代的迭代器
Iterator descendingIterator();
// 返回此集合中的部分视图(按照指定范围返回)
NavigableSet subSet(E fromElement, boolean fromInclusive,
E toElement, boolean toInclusive);
SortedSet subSet(E fromElement, E toElement);
// 返回此集合中小或等于于指定元素的元素子集合
SortedSet headSet(E toElement);
NavigableSet headSet(E toElement, boolean inclusive);
// 返回此集合中大于或等于指定元素的元素子集合
SortedSet tailSet(E fromElement);
NavigableSet tailSet(E fromElement, boolean inclusive);
}
在后续文章中将逐一学习和分析集合中的类和接口。敬请期待!!!