[JDK] JDKのソースコード解析 - リスト、イテレータ、反復子

リストは、最も一般的に使用されるコンテナの一つです。ソースコード、ソースコード解析インターフェイスの優先順位なので、ここではインタフェース解析開始リストの分析は、先に述べました。リスト方法は次のとおりです。 

 

上記の「JDKのソースコード解析 - コレクションは、」コレクションインターフェイスのメソッドにされているように、簡単に分析、およびコレクションリストから継承されたインターフェースなので、ここではリストのみいくつかの特定の方法を分析しています。

// 将一个集合的所有元素添加到当前集合的指定位置;
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: 本文首发自微信公众号。

おすすめ

転載: www.cnblogs.com/jaxer/p/11105422.html