让我来带着楼主深入走进listIterator方法的方法体
接下来我跟你说的是JAVAlistIterator方法中的源码,他们是如何实现的
在看他们是如何实现的之前 我们先要看方法的含义 在JAVA文档中的介绍 :
如下:返回在列表中的元素的列表迭代器(顺序)。此实现返回ListIterator(0)。
为什么要返回ListIterator因为需要被迭代便利的(说白了就是需要用的)元素种类很多ArrayList只是其中一种所以返回一个接口
然后我们要找到ListIterator方法所在的位置 位于 java.util.AbstractList.listIterator()
这个类的结构如下
class AbstractList<E> extends AbstractCollection<E> implements List<E>
方法体是这样的
public ListIterator<E> listIterator(final int index) {
if (index<0 || index>size())
throw new IndexOutOfBoundsException("Index: "+index);
return new ListItr(index);
}
刚才通过调用我发现index的值传入的时候是0固定的就是0加上final所以必定不会抛出异常而是走了new了一个ListItr类然后在构造中传入index 我们继续往下看ListItr类
ListItr
private class ListItr extends Itr implements ListIterator<E> {
ListItr(int index) {
cursor = index;
}
在这里 他将0(索引)赋值给了游标,然后将这个已经有了游标的ListItr返回 ,现在 我们接收到的对象应该是一个实现了ListIterator并且继承了Itr 类的一个ListItr 对象 。接着程序往下走你看到这个对象调用了.hasnext()方法来判断是否有下个值
请看li.hasNext()的方法体
public boolean hasNext() {
return cursor != size();
}
还记得刚才我们传入的游标吗 ,调用之前 他已经把游标的值传入0了 所以这个cursor 必定为0 size()暂时不做介绍了 楼主只要知道他这里的size方法必定返回调用的集合的size就可以了 。所以现在断定0!=4 对吧 。自然会返回false ,也就是说 这个集合中还有值
所以接下来调用li.next()方法
next方法做重点介绍
public E next() {
checkForComodification();
try {
E next = get(cursor);
lastRet = cursor++;
return next;
} catch (IndexOutOfBoundsException e) {
checkForComodification();
throw new NoSuchElementException();
}
}
进入next以后 首先会执行checkForComodification方法
final void checkForComodification() {
if (modCount != expectedModCount)
throw new ConcurrentModificationException();
}
这个方法会检查是否有并发修改的情况 所以单独建立一个值
然后接着往下走cursor的值是0 代表取集合元素中第一个值
请看get方法的源码
public E get(int index) {
RangeCheck(index);
return (E) elementData[index];
}
在取值之前 一定要先检查索引的值是不是已经到了最后一个 如果到了 就会发生异常
private void RangeCheck(int index) {
if (index >= size)
throw new IndexOutOfBoundsException(
"Index: "+index+", Size: "+size);
}
所以做了这样的异常界定超过之后就会抛出IndexOutOfBoundsException
然后 楼主肯定会好奇E的类型 明明你调用的是你自己写的类为什么会使E呢? 请看最上面对
class AbstractList<E> extends AbstractCollection<E> implements List<E>
已经对E进行了规范 。所以你的类型兼容E的类型
于是就把从E中取到的值进行返回也就是我们今天看到的ArrayList的迭代器大致远离
纯手打 跪求技术分 最好多给点
|