46. 迭代器
Posted 江小白谢
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了46. 迭代器相关的知识,希望对你有一定的参考价值。
Collection的迭代器:
toArray 返回一个object类型的数组
itaretor 返回在此 collection 的元素上进行迭代的迭代器
Iterator接口中的方法:
hasNext() 当前指针是否有指向元素,有返回true,没有false
next() 返回指针指向的元素后指针向下移动一个单位。
remove() 移除迭代器最后一次返回的元素(注意:此方法不能直接执行,只有迭代器返回元素后才能使用,否则会报错)
需求:用迭代器循环集合
代码如下:
public static void main(String[] args) {
Collection list = new ArrayList();
list.add("张三");
list.add("李四");
list.add("王五");
System.out.println(list);
Iterator it = list.iterator();//返回一个迭代器
while(it.hasNext()) {
System.out.print(it.next()+",");
}
}
疑问1:iterator方法返回的不是一个接口吗,怎么可以调用方法呢?
我们来看看源代码
iterator方法的源代码如下()
原来它返回的是一个Itr类的对象,接下来我们看Itr是什么
public Iterator<E> iterator() {
return new Itr();
}
在Itr类的源代码中发现:
private class Itr implements Iterator<E>
原来是实现了Iterator接口的实现类,那么这个就是多态。
多态:父类引用变量指向了子类的对象
疑问2:hasNext()方法和next()方法的工作原理是什么呢?
下面是Itr实现类的两个方法的源代码:
public boolean hasNext() {
return cursor != size;
}
public E next() {
checkForComodification();
int i = cursor;
if (i >= size)
throw new NoSuchElementException();
Object[] elementData = ArrayList.this.elementData;
if (i >= elementData.length)
throw new ConcurrentModificationException();
cursor = i + 1;
return (E) elementData[lastRet = i];
}
这个是Itr实现类的成员变量
int cursor; // index of next element to return
int lastRet = -1; // index of last element returned; -1 if no such
int expectedModCount = modCount;
其他的代码先不看,我们可以发现首先先定义了一个cursor变量,当执行hasnext方法时先判断cursor是否不等于集合中元素的长度,不是,返回false,是返回ture。
next方法中首先我们可以看到int i = cursor 输出当前指针指向的元素后,cursor = i+1 了
下面是工作原理图:
以上是关于46. 迭代器的主要内容,如果未能解决你的问题,请参考以下文章
Simulink - 通过 MATLAB 命令行将 While 迭代器模块添加到子系统