Java深入分析Iterator迭代器与foreach循环的使用
一、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. 代码演示
@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()); // 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()); } }
@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循环的使用的文章就介绍到这了,更多相关Java Iterator迭代器内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
Spring Boot整合Swagger测试api构建全纪录
这篇文章主要给大家介绍了关于Spring Boot整合Swagger测试api构建的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧2019-01-01springboot2.3之后hibernate-validator依赖缺失【踩坑】
这篇文章主要介绍了springboot2.3之后hibernate-validator依赖缺失【踩坑】,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧2020-11-11
最新评论