ListSetQueueCollection 接口的三个子接口,我们重点要记住它们在 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 的声明的方法如下所示:

  1. public interface ListIterator<E> extends Iterator<E> {
  2. // Query Operations
  3. boolean hasNext(); // ↑ Iterator
  4. E next(); // ↑ Iterator
  5. boolean hasPrevious();
  6. E previous();
  7. int nextIndex();
  8. int previousIndex();
  9. // Modification Operations
  10. void remove(); // ↑ Iterator
  11. void set(E e);
  12. void add(E e);
  13. }

另外,和 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 的限制,更多是源于实现类的结构,所以在讨论这种限制时,应该结合实现类的内部结构进行分析。