List
、 Set
、 Queue
是 Collection
接口的三个子接口,我们重点要记住它们在 Collection
接口的基础上添加了哪些方法。
List 接口
官方对 List 的定义是 An ordered collection,相比 Collection
,它多了有序性,因此我们可以通过 index 来操纵 element。整体来看,我们需要记住两点:一是 List
新增的方法,二是 ListIterator 的特性。
对于新增方法,大致可分为如下几类:
- 4 个基于 index 的操纵方法:
void add(int index, E element)
、E remove(int index)
、E set(int index, E element)
、E get(int index)
; - 2 个获取对象 index 的方法:
int indexOf(Object o)
、int lastIndexOf(Object o)
; - 2 个批量操作方法:
boolean addAll(int index, Collection<? extends E> c)
、default void replaceAll(UnaryOperator<E> operator)
; - 1 个排序方法:
default void sort(Comparator<? super E> c)
。
ListIterator
接口继承自 Iterator
接口, 它在 Iterator
仅能“遍历”和“删除”的基础上,扩充了“新增”和“修改”的功能(由于 List 保证了有序性)。 List
提供了 2 个方法获取 ListIterator
对象,分别是:
ListIterator<E> listIterator()
;ListIterator<E> listIterator(int index)
;
ListIterator
的声明的方法如下所示:
public interface ListIterator<E> extends Iterator<E> {
// Query Operations
boolean hasNext(); // ↑ Iterator
E next(); // ↑ Iterator
boolean hasPrevious();
E previous();
int nextIndex();
int previousIndex();
// Modification Operations
void remove(); // ↑ Iterator
void set(E e);
void add(E e);
}
另外,和 Iterator
一样, ListIterator
中的 remove()
和 set(E e)
方法在调用前都必须先调用 next()
或 previous()
方法。
Set 接口
官方对 Set 的定义是 A collection that contains no duplicate elements,与 Collection
相比,它增加了 element 的唯一性,而这种唯一性是基于 equals()
方法进行判断的。
set 的 element 允许为 null
,与 Collection
接口相比,Set
接口并未新增任何方法。
Queue 接口
官方对 Queue 的描述是 A collection designed for holding elements prior to processing,你可以简单的理解为 FIFO 队列,即尾部插入、头部取出。
Queue
接口与 Collection
接口相比,它针对“插入”、“删除”、“查看”都提供了两套方法:
Throws exception | Returns special value | ||
---|---|---|---|
Insert | boolean add(e) | boolean offer(e) | 尾部插入 |
Remove | E remove() | E poll() | 删除头部 element |
Examine | E element() | E peek() | 返回头部 element,但不删除 |
element 能否为 null
我个人认为,在接口层面,List、Set、Queue 的 element 都可以为 null
。而对于 element 不能为 null
的限制,更多是源于实现类的结构,所以在讨论这种限制时,应该结合实现类的内部结构进行分析。