iterator迭代器和for循环的区别,java for 迭代器
00-1010一、迭代器接口1。用迭代器接口2遍历集合元素。迭代器接口方法3。迭代器的执行原理3.1代码演示3.2代码执行过程分析4。迭代器接口remove()方法4.1代码演示4.2注5。代码演示2。foreach循环1。概述2。语法分析3。代码演示4。容易出错的问题
目录
一、 Iterator迭代器接口
Iterator对象称为迭代器(一种设计模式),主要用于遍历集合集合中的元素。
GOF将迭代器模式定义为提供一种方法来访问容器对象中的每个元素,而不暴露对象的内部细节。迭代器模式是为容器而生的。类似于“公交车上的售票员”、“火车上的乘务员”、“空姐”。
collection接口继承了java.lang.Iterable接口,该接口有一个iterator()方法,因此所有实现Collection接口的集合类都有一个iterator()方法来返回实现Iterator接口的对象。
迭代器只用于遍历集合,迭代器本身不提供托管对象的能力。如果你需要创建一个迭代器对象,你必须有一个迭代集。
每次集合调用iterator()方法,都会得到一个全新的迭代器对象,默认光标在集合的第一个元素之前。
1. 使用 Iterator 接口遍历集合元素
注意:在调用it.next()方法之前,必须调用it.hasNext()进行检测。如果不调用,下一条记录无效,直接调用它. next()会抛出NoSuchElementException异常。
2. Iterator接口的方法
00-1010//hasnext () :判断是否有下一个元素while(iterator . has next()){//next()3360下移指针下移至system . out . println(iterator . next())后返回设定位置的元素;}
迭代器iterator=coll.iterator()执行时00-1010;语句,迭代器的指针执行下图标记的位置,然后执行iterator.hasNext()语句。此时会判断迭代器指针所指位置的下一个位置()是否有元素。如果有,则返回true,否则返回false。当返回结果为真时,向下执行iterator.next()语句,此时迭代器的指针下移,返回下移后指针所指向的设定位置的元素。
3. 迭代器的执行原理
3.1 代码演示
迭代器ITER=coll . Iterator();//回到起点while(ITER . has next()){ object obj=ITER . next();if(obj . equals( Tom ){ ITER。
remove();} }
4.2 注意
⭕Iterator
可以删除集合的元素,但是是遍历过程中通过迭代器对象的remove
方法,不是集合对象的remove
方法。
⭕ 如果还未调用next()
或在上一次调用next()
方法之后已经调用了remove
方法,再调用remove
都会报IllegalStateException
异常。
5. 代码演示
@Test public void test1(){ Collection coll = new ArrayList(); coll.add(123); coll.add(456); coll.add(new Person("Jerry",20)); coll.add(new String("Tom")); coll.add(false); Iterator iterator = coll.iterator(); //方式一:// System.out.println(iterator.next());// //报异常:NoSuchElementException //方式二:不推荐// for(int i = 0;i < coll.size();i++){// System.out.println(iterator.next());// } //方式三:推荐 hasNext():判断是否还有下一个元素 while(iterator.hasNext()){ //next():①指针下移 ②将下移以后集合位置上的元素返回 System.out.println(iterator.next()); } }
@Test public void test2(){ Collection coll = new ArrayList(); coll.add(123); coll.add(456); coll.add(new Person("Jerry",20)); coll.add(new String("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。
@Test public void test3(){ Collection coll = new ArrayList(); coll.add(123); coll.add(456); coll.add(new Person("Jerry",20)); coll.add(new String("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. 代码演示
@Test public void test1(){ Collection coll = new ArrayList(); coll.add(123); coll.add(456); coll.add(new Person("Jerry",20)); coll.add(new String("Tom")); coll.add(false); //for(集合元素的类型 局部变量 : 集合对象) //内部仍然调用了迭代器。 for(Object obj : coll){ System.out.println(obj); } //123 //456 //Person@621be5d1 //Tom //false }
@Test public void test2(){ int[] arr = new int[]{1,2,3,4,5,6}; //for(数组元素的类型 局部变量 : 数组对象) for(int i : arr){ System.out.println(i); } //1 //2 //3 //4 //5 //6 }
4. 易错题
public class test { public static void main(String[] args) { String[] str = new String[5]; for (String myStr : str) { myStr = "小老师ir"; System.out.println(myStr); } //小老师ir //小老师ir //小老师ir //小老师ir //小老师ir for (int i = 0; i < str.length; i++) { System.out.println(str[i]); } //null //null //null //null //null }}
到此这篇关于Java-Iterator迭代器与foreach循环的文章就介绍到这了,更多相关JavaIterator迭代器内容请搜索盛行IT以前的文章或继续浏览下面的相关文章希望大家以后多多支持盛行IT!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。