Iterator迭代器与foreach循环
前言
本博主将用CSDN记录软件开发求学之路上亲身所得与所学的心得与知识,有兴趣的小伙伴可以关注博主!
也许一个人独行,可以走的很快,但是一群人结伴而行,才能走的更远!让我们在成长的道路上互相学习,欢迎关注!
一、 Iterator迭代器接口
1. 使用 Iterator 接口遍历集合元素
⭕
Iterator
对象称为迭代器(设计模式的一种),主要用于遍历
Collection
集合中的元素。
⭕
GOF
给迭代器模式的定义为:提供一种方法访问一个容器(
container
)对象中各个元素,而又不需暴露该对象的内部细节。迭代器模式,就是为容器而生。类似于“公交车上的售票员”、“火车上的乘务员”、“空姐”。
⭕
Collection
接口继承了
java.lang.Iterable
接口,该接口有一个
iterator()
方法,那么所有实现了
Collection
接口的集合类都有一个
iterator()
方法,用以返回一个实现了
Iterator
接口的对象。
⭕
Iterator
仅用于遍历集合,
Iterator
本身并不提供承装对象的能力。如果需要创建
Iterator
对象,则必须有一个被迭代的集合。
⭕集合对象每次调用
iterator()
方法都得到一个全新的迭代器对象,默认游标都在集合 的第一个元素之前。
2. Iterator接口的方法
注意:在调用
it.next()
方法之前必须要调用
it.hasNext()
进行检测。若不调用,且下一条记录无效,直接调用
it.next()
会抛出
NoSuchElementException
异常。
3. 迭代器的执行原理
3.1 代码演示
//hasNext():判断是否还有下一个元素while(iterator.hasNext()){//next():①指针下移 ②将下移以后集合位置上的元素返回System.out.println(iterator.next());}
3.2 代码执行过程解析
当执行
Iterator iterator = coll.iterator();
语句时,
iterator
的指针此时执行下图的①所标的位置,然后执行
iterator.hasNext()
语句,此时会去判断
iterator
的指针指向的位置的下一个位置(即②)有无元素,若有,则返回
true
,否则返回
false
。当返回结果为
true
时,则往下执行
iterator.next()
语句,此时
iterator
的指针下移并且把下移后的指针指向的集合位置上的元素返回。
4. Iterator接口remove()方法
4.1 代码演示
Iterator iter = coll.iterator();//回到起点while(iter.hasNext()){Object obj = iter.next();if(obj.equals("Tom")){
iter.remove();}}
4.2 注意
⭕
Iterator
可以删除集合的元素,但是是遍历过程中通过迭代器对象的
remove
方法,不是集合对象的
remove
方法。
⭕ 如果还未调用
next()
或在上一次调用
next()
方法之后已经调用了
remove
方法,再调用
remove
都会报
IllegalStateException
异常。
5. 代码演示
@Testpublicvoidtest1(){Collection coll =newArrayList();
coll.add(123);
coll.add(456);
coll.add(newPerson("Jerry",20));
coll.add(newString("Tom"));
coll.add(false);Iterator iterator = coll.iterator();//方式一:// System.out.println(iterator.next());// System.out.println(iterator.next());// System.out.println(iterator.next());// System.out.println(iterator.next());// System.out.println(iterator.next());// //报异常:NoSuchElementException// System.out.println(iterator.next());//方式二:不推荐// for(int i = 0;i < coll.size();i++){// System.out.println(iterator.next());// }//方式三:推荐hasNext():判断是否还有下一个元素while(iterator.hasNext()){//next():①指针下移 ②将下移以后集合位置上的元素返回System.out.println(iterator.next());}}
@Testpublicvoidtest2(){Collection coll =newArrayList();
coll.add(123);
coll.add(456);
coll.add(newPerson("Jerry",20));
coll.add(newString("Tom"));
coll.add(false);//错误方式一:// Iterator iterator = coll.iterator();// while((iterator.next()) != null){// System.out.println(iterator.next());// }//错误方式二://集合对象每次调用iterator()方法都得到一个全新的迭代器对象,默认游标都在集合的第一个元素之前。while(coll.iterator().hasNext()){System.out.println(coll.iterator().next());}}//测试Iterator中的remove()//如果还未调用next()或在上一次调用 next 方法之后已经调用了 remove 方法,// 再调用remove都会报IllegalStateException。
@Testpublicvoidtest3(){Collection coll =newArrayList();
coll.add(123);
coll.add(456);
coll.add(newPerson("Jerry",20));
coll.add(newString("Tom"));
coll.add(false);//删除集合中"Tom"Iterator iterator = coll.iterator();while(iterator.hasNext()){// iterator.remove();Object obj = iterator.next();if("Tom".equals(obj)){
iterator.remove();// iterator.remove();}}//遍历集合
iterator = coll.iterator();while(iterator.hasNext()){System.out.println(iterator.next());}}
二、foreach 循环
1. 概述
⭕
Java 5.0
提供了
foreach
循环迭代访问
Collection
和数组。
⭕ 遍历操作不需获取
Collection
或数组的长度,无需使用索引访问元素。
⭕ 遍历集合的底层调用
Iterator
完成操作。
⭕
foreach
还可以用来遍历数组。
2. 语法解析
3. 代码演示
@Testpublicvoidtest1(){Collection coll =newArrayList();
coll.add(123);
coll.add(456);
coll.add(newPerson("Jerry",20));
coll.add(newString("Tom"));
coll.add(false);//for(集合元素的类型 局部变量 : 集合对象)//内部仍然调用了迭代器。for(Object obj : coll){System.out.println(obj);}//123//456//Person@621be5d1//Tom//false}
@Testpublicvoidtest2(){int[] arr =newint[]{1,2,3,4,5,6};//for(数组元素的类型 局部变量 : 数组对象)for(int i : arr){System.out.println(i);}//1//2//3//4//5//6}
4. 易错题
publicclass test {publicstaticvoidmain(String[] args){String[] str =newString[5];for(String myStr : str){
myStr ="小老师ir";System.out.println(myStr);}//小老师ir//小老师ir//小老师ir//小老师ir//小老师irfor(int i =0; i < str.length; i++){System.out.println(str[i]);}//null//null//null//null//null}}
版权归原作者 小老师ir 所有, 如有侵权,请联系我们删除。