前言
上一篇主要介绍了java集合框架的一个整体结构,并简单分析了下Iterator接口的源码,接下来分析ListIterator的源码
ListIterator
ListIterator也是一个接口类,继承了Iterator接口,对比于Iterator,它的方法如下:
- boolean hasNext() // 判断后面是否还有元素
- E next() // 返回下一个元素
- boolean hasPrevious() // 判断前面是否还有元素
- E previous() // 返回上一个元素
- int nextIndex() // 返回之后调用next()方法返回的那个元素的索引
- int previousIndex() // 返回之后调用previous()方法返回的那个元素的索引
- void remove() //移除元素
- void set(E e) // 用指定的元素替换next或previous方法返回的最后一个元素。 该方法只有在调用了next或previous之后,没有调用remove和add方法的情况下才能调用。
- void add(E e) // 插入一个指定元素到list中。该元素会插入到调用next方法返回的那个元素之前或者调用previous方法返回的那个元素之后,即是插入到当前游标的前面位置。
ListIterator与Iterator的区别
根据官方文档:
* An iterator for lists that allows the programmer
* to traverse the list in either direction, modify
* the list during iteration, and obtain the iterator's
* current position in the list. A {@code ListIterator}
* has no current element; its <I>cursor position</I> always
* lies between the element that would be returned by a call
* to {@code previous()} and the element that would be
* returned by a call to {@code next()}.
* An iterator for a list of length {@code n} has {@code n+1} possible
* cursor positions, as illustrated by the carets ({@code ^}) below:
* <PRE>
* Element(0) Element(1) Element(2) ... Element(n-1)
* cursor positions: ^ ^ ^ ^ ^
* </PRE>
ListIterator实现了List的从后往前迭代遍历的功能,并且,这里提出了一个游标(cursor)的概念,而且该游标永远指向两个元素之间或在第一个元素前或在最后一个元素后,而不是指向某个具体的元素位置。
由此看出,当集合中有N个元素时,游标可能的位置有N+1个。