目录
一、迭代器的应用——遍历集合
步骤1:通过集合获取迭代器
步骤2:使用while循环
案例展示:
二、跟踪源代码
#1. 通过集合获取迭代器
#2. 通过成员方法next( ) 获取每一个集合元素对象
#3. 通过成员方法hasNext( )判断是否进行下一次循环
图示
一、迭代器的应用——遍历集合
步骤1:通过集合获取迭代器
相关方法:
Interator<E> iterator( )
步骤2:使用while循环
相关方法:
boolean hasNext( ) —— 作为条件判断语句
E next( ) —— 获取每一个集合元素对象
案例展示:
下列代码完成统计字符串在集合中出现次数的操作。
public class Test {
public static void main(String[] args) {
Collection<String> list = new ArrayList<>();
list.add("a");
list.add("a");
list.add("b");
list.add("b");
list.add("c");
System.out.println("a:"+listTest(list, "a"));
System.out.println("b:"+listTest(list, "b"));
System.out.println("c:"+listTest(list, "c"));
System.out.println("xxx:"+listTest(list, "xxx"));
}
public static int listTest(Collection<String> list,String s) {
Iterator<String> iterator = list.iterator();
int count = 0;
while(iterator.hasNext()) {
String str = iterator.next();
if(str.equals(s)) {
count ++;
}
}
return count;
}
}
二、跟踪源代码
#1. 通过集合获取迭代器
Interator<E> iterator( )
以ArrayList为例,以下是ArrayList调用该方法的过程。
public Iterator<E> iterator() {
return new Itr();
}
由于Iterator是一个接口,我们可以得知Itr是其的一个实现类,下列调用的方法否是由此实现类完成实现的。
这个类除了是Iterator的实现类外,还是ArrayList的成员内部类。
private class Itr implements Iterator<E> {
int cursor;
}
其中包含一个成员变量cursor,没有对其赋初值,则默认初始值为0。
#2. 通过成员方法next( ) 获取每一个集合元素对象
#3. 通过成员方法hasNext( )判断是否进行下一次循环
public boolean hasNext() {
return cursor != size;
}
我们知道,在成员内部类中可以直接调用外部类的成员信息。
这句代码也可改写为:return cursor != this.size;
通过while每循环一次,cursor+1,初始值为0,即获取数组第一个下标位置的元素。数组最后一个元素的下标为length-1,因此当cursor一直累加直到等于集合的size大小,数组的length长度时,“越界”—— 退出循环。
图示