Java中的迭代器和foreach原理

 更新时间:2020年09月08日 11:05:55   作者:崔笑颜  
这篇文章主要介绍了Java中的迭代器和foreach原理,帮助大家更好的理解和学习Java,感兴趣的朋友可以了解下

迭代器是一种设计模式,它的定义为:提供一种方法访问一个容器对象中的各个元素,而又不需暴露该容器对象的内部细节。迭代器模式,就是为容器而生。

在Java中,Iterator称为迭代器,主要用于遍历 Collection 集合中的元素。Iterator 仅用于遍历集合,Iterator 本身并不提供承装对象的能力。如果需要创建Iterator 对象,则必须有一个被迭代的集合。Collection接口继承了java.lang.Iterable接口,该接口有一个iterator()方法,那么所有实现了Collection接口的集合类都有一个iterator()方法,用以返回一个实现了Iterator接口的对象。并且集合对象每次调用iterator()方法都得到一个全新的迭代器对象,默认指针(游标)都在集合的第一个元素之前。

1、Iterator接口中的常用方法

boolean hasNext():判断集合中是否还有下一个元素
E next():返回下一个元素
void remove():删除元素

注意:

  • 1.在调用next()方法之前必须要调用hasNext()方法进行判断。如果下一条记录无效,而且又没有调用hasNext()方法进行判断,那么直接调用next()方法就会抛出NoSuchElementException异常。
  • 2.Iterator可以删除集合的元素,但是是通过迭代器对象的remove方法,不是集合对象的remove方法。
  • 3.如果还未调用next()方法或在上一次调用next()方法之后已经调用了remove()方法,再调用remove()方法都会报IllegalStateException异常。

2.Iterator的使用方法(遍历集合)

Collection coll=new ArrayList();
coll.add(123);
coll.add(456);
coll.add(789);
coll.add(new Person("Tom",12));

Iterator iterator = coll.iterator();
while(iterator.hasNext()){
 System.out.println(iterator.next());
}

3、Iterator的执行原理

迭代器的执行原理如下图所示:

集合对象每次调用iterator()方法得到的迭代器对象,默认指针(游标)都在集合的第一个元素之前。我们在使用迭代器时,首先会使用hasNext()方法判断集合中是否还有下一个元素,如果有就会调用next()方法,调用next()方法分为两个步骤:一是把当前指针下移一位,二是将下移以后位置上的元素返回,如上图所示。

4、增强for循环:foreach

在Java 5.0提供了一种新的迭代访问 Collection和数组的方法,就是foreach循环。使用foreach循环执行遍历操作不需获取Collection或数组的长度,也不需要使用索引访问元素。
使用方法如下所示:

public static void main(String[] args) {
 int[] ints={1,2,3,4};
 for (int i:ints) {
  System.out.println(i);
 }

 Collection coll = new ArrayList();
 coll.add(123);
 coll.add(456);
 coll.add(789);
 coll.add(new Person(1001, "Tom"));
 for (Object object:coll) {
  System.out.println(object);
 }
}

那么foreach循环是怎样实现的呢?
下面我们来看一下上述代码编译后的源码文件,如下所示:

编译后的源码如下:

public static void main(String[] args) {
  int[] ints = new int[]{1, 2, 3, 4};
  int[] var2 = ints;
  int var3 = ints.length;

  for(int var4 = 0; var4 < var3; ++var4) {
   int i = var2[var4];
   System.out.println(i);
  }

  Collection coll = new ArrayList();
  coll.add(123);
  coll.add(456);
  coll.add(789);
  coll.add(new Person(1001, "Tom"));
  Iterator var7 = coll.iterator();

  while(var7.hasNext()) {
   Object object = var7.next();
   System.out.println(object);
  }

 }

由编译后的源码可知,使用foreach循环遍历数组时,底层仍然是通过for循环实现的;而遍历集合时,底层是通过迭代器实现的。

以上就是Java中的迭代器和foreach原理的详细内容,更多关于Java 迭代器和foreach的资料请关注脚本之家其它相关文章!

相关文章

  • IntelliJ IDEA 2022.1.1 沒有CVS的过程分析

    IntelliJ IDEA 2022.1.1 沒有CVS的过程分析

    这篇文章主要介绍了IntelliJ IDEA 2022.1.1 沒有CVS的过程解析,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-07-07
  • spring boot jpa写原生sql报Cannot resolve table错误解决方法

    spring boot jpa写原生sql报Cannot resolve table错误解决方法

    在本篇文章里小编给大家整理的是关于spring boot jpa写原生sql报Cannot resolve table错误的解决方法,需要的朋友学习下。
    2019-11-11
  • springmvc的文件保存方法详解

    springmvc的文件保存方法详解

    这篇文章主要介绍了springmvc的文件保存方法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-09-09
  • Java8的default方法详细介绍

    Java8的default方法详细介绍

    这篇文章主要介绍了Java8的default方法,详细介绍了什么是default方法,在多继承时的处理等,需要的朋友可以参考下
    2014-04-04
  • java语言自行实现ULID过程底层原理详解

    java语言自行实现ULID过程底层原理详解

    这篇文章主要为大家介绍了java语言自行实现ULID过程底层原理详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-10-10
  • Java编程BigDecimal用法实例分享

    Java编程BigDecimal用法实例分享

    这篇文章主要介绍了Java编程BigDecimal用法实例分享,具有一定参考价值,需要的朋友可以了解下。
    2017-11-11
  • IDEA卡在”正在解析Maven依赖项“的解决方法

    IDEA卡在”正在解析Maven依赖项“的解决方法

    在创建新的SpringBoot项目时,始终卡在"正在解析Maven依赖项…",本文小编给大家介绍了几种相关的解决方案,具有一定的参考价值,需要的朋友可以参考下
    2023-11-11
  • Java 坐标系相互转换方式

    Java 坐标系相互转换方式

    这篇文章主要介绍了Java中的坐标系相互转换方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-08-08
  • Hibernate之环境搭建及demo分享

    Hibernate之环境搭建及demo分享

    下面小编就为大家分享一篇Hibernate之环境搭建及demo,具有很好的参考价值,希望对大家有所帮助
    2017-11-11
  • Java设计模式中的抽象工厂模式解读

    Java设计模式中的抽象工厂模式解读

    这篇文章主要介绍了Java设计模式中的抽象工厂模式解读,抽象工厂模式为创建一组相关或相互依赖的对象提供一个接口,而且无需指定他们的具体类,需要的朋友可以参考下
    2023-11-11

最新评论