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 Operationsboolean hasNext(); // ↑ IteratorE next(); // ↑ Iteratorboolean hasPrevious();E previous();int nextIndex();int previousIndex();// Modification Operationsvoid remove(); // ↑ Iteratorvoid 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 的限制,更多是源于实现类的结构,所以在讨论这种限制时,应该结合实现类的内部结构进行分析。
