[JDK] JDK source code analysis -List, Iterator, ListIterator

List is one of the most commonly used container. Mentioned earlier, the analysis of the source code, source code analysis interface priority, so here Interface analysis start List. List methods are listed below: 

 

As the above "JDK source code analysis -Collection" has been on the methods of the Collection interface are briefly analyzed, and the interface inherited from the Collection List, so here List only analyze some specific methods:

// 将一个集合的所有元素添加到当前集合的指定位置;
boolean addAll(int index, Collection<? extends E> c);

// 用指定的运算结果替代集合中的所有元素
default void replaceAll(UnaryOperator<E> operator);

// 用指定的 Comporator 对集合元素进行排序
default void sort(Comparator<? super E> c);

// 获取指定位置的元素
E get(int index);

// 将某个位置的元素替换为指定元素
E set(int index, E element);

// 将指定元素添加到集合的指定位置
void add(int index, E element);

// 移除指定位置的元素
E remove(int index);

// 某个元素在集合中(第一次出现)的位置
int indexOf(Object o);

// 某个元素在集合中最后一次出现的位置
int lastIndexOf(Object o);

// 返回元素的列表迭代器
// 相当于 list.listIterator(0)
ListIterator<E> listIterator();

// 返回元素的 listIterator(指定起始位置)
ListIterator<E> listIterator(int index);

// 获取集合的子集
List<E> subList(int fromIndex, int toIndex);

 

由于这里涉及到了 ListIterator 接口,而它又继承自 Iterator 接口,因此对这两个接口也进行简要分析,同时也算为后续分析 ArrayList 等实现类做些准备工作。这两个接口的继承结构如下:

 

Iterator 接口是用于遍历集合元素的迭代器,它替代了 JCF 中的 Enumeration 接口。其方法概述如下:

// 是否有更多元素
boolean hasNext();

// 返回迭代的下一个元素
E next();

// 从底层集合中删除此迭代器返回的最后一个元素(可选操作)
// 每次调用 next() 时只能调用一次此该方法
default void remove();

// 对剩余的每个元素执行给定的操作
default void forEachRemaining(Consumer<? super E> action);

ListIterator,列表的迭代器,继承自 Iterator,可以从列表的两端进行遍历(Iterator 只能从前到后)。它在 Iterator 基础上增加方法如下:
// 是否有前一个元素(可理解为从后往前遍历)
boolean hasPrevious();

// 获取前一个元素
E previous();

// 返回对 next() 的后续调用将返回的元素的索引
// 如果列表迭代器位于列表的末尾,则返回列表大小
int nextIndex();

// 返回对 previous() 的后续调用将返回的元素的索引
// 如果列表迭代器位于列表的开头,则返回 -1
int previousIndex();

// 用指定的元素替换 next() 或 previous() 返回的最后一个元素
void set(E e);

// 插入指定元素到列表中
void add(E e);

 

注意,迭代器的游标在元素之间,如下:

/*
 *                      Element(0)   Element(1)   Element(2)   ... Element(n-1)
 * cursor positions:  ^            ^            ^            ^                  ^
 */

 

二者的区别与联系:

1. ListIterator 继承自 Iterator.

2. 都有 remove() 方法,都可以删除对象。

3. 都有 next() 和 hasNext() 方法,都可以实现向后遍历;而 ListIterator 有 previous() 和 hasPrevious() 方法,可以向前遍历。

4. ListIterator 有 add() 和 set() 方法,可以向 List 添加和修改元素;而 Iterator 不能。

 

小结:

List 作为集合(Collection),其最主要的特点就是「有序」,可以把它理解为一个数组,因此才能进行许多与位置(下标)相关的操作。

 

Stay hungry, stay foolish.

PS: 本文首发自微信公众号。

Guess you like

Origin www.cnblogs.com/jaxer/p/11105422.html