java 集合框架使程序处理集合数组的方法标准化。集合框架包含了一组标准的接口。对这些接口,提供了几个标准的实现工具(LinkedList、HashSet 和 TreeSet);
集合接口:
接口 | 描述 |
Collection | 集合框架的顶层接口,定义了操作对象集合的共同方法 |
List | 继承 Collection,表示有序的,可包括重复元素的列表 |
Set | 继承 Collection,表示无序的,无重复元素的列表 |
SortSet | 继承 Set,对Set中元素进行排序 |
Queue | 继承 Collection,定义了队列数据结构的操作方式 |
Deque | 继承了Queue,定义了双向队列数据结构的操作方式 |
集合接口类图如下:
Collection 接口
Collection 接口是构造集合框架的基础。它声明所有类集合都将拥有的核心方法。因为所有类集合实现 Collection,所以熟悉它的方法对于清楚地理解框架是必要的。
注意:其中几个方法可能会引发一个 UnsupportedOperationException 异常,这些发生在当类集合不能被修改时。当一个对象与另一个对象不兼容,例如,当企图增加一个不兼容的对象到一个集合中时,将产生一个ClassCastException异常。
Collection 定义的方法:
方法 | 描述 |
boolean add (Object obj) | 将 obj加入到调用类集合中。如果Obj被加入到类集合中了,则返回 true,如果未能加入集合,则返回 false。 |
booleand addAll(Collection c) | 将 c 中的所有元素都加入到类集合中,如果操作成功,则返回 true, 否则返回 false。 |
void clear() | 从调用类集合中删除所有元素 |
boolean contains(Object obj) | 如果 obj 是调用类集合中的一个元素,则返回 true,否则返回 false。 |
boolean containsAll(Collection c) | 如果调用类集合包含了 c 中的所有元素,则返回 true,否则返回 false。 |
boolean equals(Object obj) | 如果调用类集合与 obj相等,则返回 true,否则返回 false |
int hashCode() | 返回调用类集合的散列值 |
boolean isEmpty() | 如果调用类集合时空的,则返回true,否则返回 false。 |
Iterator iterator() | 返回调用类集合的迭代器 |
boolean remove(Object obj) | 从调用类集合中删除 obj 的一个实例。如果这个元素被删除了,则返回 true,否则返回 false |
boolean removeAll(Collection c) | 从调用类集合中删除 c 的的所有元素。如果类集合被改变了(也就是说元素被删除了),则返回 true,否则返回 false |
boolean retainAll(Collection c) | 删除调用类集合中除了包含在 c 中的元素之外的所有元素。如果类集合被改变了(也就是说元素被删除了),则返回 true,否则返回 false |
int size() | 返回调用类集合中元素的个数 |
Object[] toArray() | 返回一个数组,该数组包含了所有存储在调用类集合中的元素 |
Object[] toArray(Object array[]) | 返回一个数组,该数组仅仅包含了那些类型与数组元素类型匹配的类集合元素。如果 array的大小与匹配元素的个数相等,则它们被返回到 array,如果 array 的大小比匹配元素的个数小,则将分配并返回一个所需大小的新数组;如果 array 的大小比匹配元素的个数大,在数组中,在类集合元素之后的单元被置为 null。如果任 一类集合元素的类型都不是 array 的子类型,则引发一个 ArrayStoreException异常 |
List接口
List接口继承了 Collection 并声明了类集的新特性。使用一个基于 零 的下标,元素可以通过他们在列表中的位置被插入和访问。一个列表可以包含重复元素。
处理 由 Collection 定义的方法之外,List 还定义了一些它自己的方法。注意:当类集合不能被修改时,其中的几种方法引发 UnsupportOperationException 异常当一个对象与另一个对象不兼容,例如,当企图增加一个不兼容的对象到一个类集中时,将产生一个ClassCastException异常。
List 定义的方法:
方法 | 描述 |
void add(int index, Object obj) | 将 obj 加入到调用列表中。插入位置的下标由 index 传递。任何已存在的,在插入点以及插入点之后的元素将后移。因此,没有元素被覆盖 |
booleand addAll(int index, Collection c) | 将 c 中的所有元素插入到调用列表中。插入位置的下标由 index 传递。任何已存在的,在插入点以及插入点之后的元素将后移。因此,没有元素被覆盖。如果调用列表改变了,则返回 true, 否则返回 false。 |
Object get(int index) | 返回存储在调用类集内指定下标处的对象 |
int indexOf(Object obj) | 返回调用列表中 obj 的第一个实例的下标。如果 obj 不是列表中的元素,则返回 -1 |
int lastIndexOf(Object obj) | 返回调用列表中 obj 的最后一个实例的下标。如果 obj 不是列表中的元素,则返回 -1 |
ListIterator listIterator() | 返回调用列表的迭代器 |
ListIterator listIterator(int index) | 返回调用列表从指定下标处开始的迭代器 |
Object remove(int index) | 删除调用列表中 index 位置的元素并返回删除的元素。删除后,列表被压缩。也就是说,被删除元素后面的元素向前移动 |
Object set(int index, Object obj) | 用 obj对调用列表内由 index 指定的位置进行赋值 |
List subList(int start, int end) | 返回一个列表,该列表包括了调用列表中从 start 到 end - 1 的元素 |
Set 和 sortSet 接口
set 接口定义了一个集合,它继承了 collection 并说明了不允许重复元素的类集的特性。因此,如果试图将仇富元素加到集合时, add() 方法将返回 false,它本身并没有定义任何附件的方法。
SortSet 接口继承了 Set 并说明了按升序排列的集合的特性。当没有元素包含在调用集合中时,其中的几种方法引发 NoSuchElementException 异常。当对象与集合中的元素不兼容时,引发 ClassCastException 异常。如果试图使用 null 对象,而集合不允许 null 时,将引发 NullPointerException 异常。
SortedSet定义的方法:
方法 | 描述 |
Comparator comparator() | 返回排序集合的比较器,如果对该集合使用自然排序,则返回 null |
Object first() | 返回排序集合的第一个元素 |
SortSet headSet(Object end) | 返回一个包含那些小于 end 的元素的 SortedSet |
Object last() | 返回排序集合的最后一个元素 |
SortSet subSet(Object start, Object end) | 返回一个 SortedSet,它包括了 从 start 到 end-1 的元素 |
SortSet tailSet(Object start) | 返回一个 SortedSet, 它包含了那些包含在类集合中的大于 等于 start 的元素 |
Queue 和 Deque 接口
Queue< E >接口(E表示集合元素的类型)扩展了 Collection 接口、定义了一个队列数据结构的操作方式。队列定义了一个 “头” 位置, 它是下一个将要被移除的元素。除了从 Collection 继承的操作外,还提供了 插入,提取和检查操作。每个方法都存在两种形式。一种 抛出异常(操作失败时),另一种返回一个特殊值(null 或 false ,具体取决于操作)。插入操作的一种形式是用于专门为有容量限制的 Queue 实现设计的;在大多数实现中,插入操作不会失败。
Queue定义的方法:
方法 | 描述 |
boolean add(E e) | 将指定的元素插入此队列(如果立即可行且不会违反容量限制),在成功时返回 true, 如果当前没有可用的空间,则抛出 IllegalStateException |
boolean offer(E e) | 将指定的元素插入此队列(如果立即可行且不会违反容量限制)当使用有容量显得队列时,此方法通常要优于 add(E),或者可能无法插入元素,而只是抛出一个异常 |
E remove() | 获取并移除此队列的头,如果此队列为空,则抛出一个异常 |
E poll() | 获取并移除此队列的头,如果此队列为空,则返回 null |
E element() | 获取,但是不移除此队列的头,此队列为空时,将抛出一个异常 |
E peek() | 获取,但是不移除此队列的头,此队列为空时,则返回 null |
remove() 和 poll() 方法可移除 和返回队列的头。到底从队列中移除哪个元素是队列排序策略的功能,而该策略在各种实现中是不同的。 remove() 和 poll() 方法仅在队列为空时其行为有所不同,remove() 方法抛出一个异常,而 poll () 方法则返回 null。
element () 和 peek() 返回但不移除队列的头。
Queue 接口并未定义阻塞队列的方法,而这种情况在并发编程中是很常见的。
BlockingQueue 接口定义了那些等待元素出现或等待队列中有可用空间的方法,这些方法扩展了此接口。
Queue 实现通常不允许插入null元素。尽管某些实现(如 LinkedList)并不禁止插入null.即使 在允许 null 的实现中,也不应该将 null 插入到 Queue 中。因为 null 也用做 poll 方法的一个特殊返回值,表明队列不包含元素。
Deque 定义了一个双端队列数据结构,支持在两端插入和移除元素。大多数Deque 实现对于他们能够包含的元素数有没固定的限制,但此接口即支持有容量限制的双端队列,也支持没有固定大小限制的双端队列。
此接口定义在双端队列两端访问元素的方法,提供插入,移除,和检查元素的方法。每种方法都存在两种形式:一种形式在操作失败时抛出异常,另一种形式返回一个特殊值 (null 或是 false,具体取决于操作)。插入操作的后一种形式是转为使用容量限制的Deque实现设计的;在大多数实现中,插入操作不能失败。
Deque 定义的方法
Tables | Are | Cool |
col 3 is | right-aligned | $1600 |
此接口扩展了 Queue 接口。在将双端队列用作队列时,将得到 FIFO (现金先出)行为。
将原始添加到双端队列的末尾,从双端队列的开头移除元素。
从Queue 接口继承的方法完全等效于 Deque 方法。
双端队列也可用作 LIFO(后进先出)堆栈。应优先使用此接口而不是遗留 Stack l类。在将双端队列用作堆栈时,元素被推入双端队列的开头并从双端队列开头弹出。堆栈方法完全等效于Deque 方法。
虽然 Deque 实现没有严格要求禁止插入 null 元素,但 建议最好不要插入 null 元素。建议任何事实上允许 null 元素的 Deque 实现,用户最好不要利用插入 null 的功能。这是因为各种方法会将null用作特殊的返回值来指示双端队列为空