一、 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 代码演示
1 2 3 4 5 |
//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 代码演示
1 2 3 4 5 6 |
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. 代码演示
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
@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()); } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
@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。 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
@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. 代码演示
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
@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 } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
@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. 易错题
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
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迭代器内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!
原文链接:https://blog.csdn.net/weixin_52533007/article/details/124310033
查看更多关于Java Iterator迭代器与foreach循环代码解析的详细内容...