我是靠谱客的博主 糟糕裙子,最近开发中收集的这篇文章主要介绍java - Iterator迭代器和foreach遍历,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

Iterator迭代器接口

  • Iterator对象称为迭代器(设计模式的一种),主要用于遍历Collection集合中的元素。

  • GOF给迭代器模式的定义为:提供一种方法访问一个容器(container)对象中的各个元素,而又不需暴露该对象的内部描述迭代器模式,就是为容器而生。

  • Collection接口继承了java.lang.Iterator接口,该接口有一个iterator()方法,那么所有实现了Collection接口的集合类都有一个iterator()方法,用以返回一个实现了Iterator接口的对象。

  • Iterator仅用于遍历集合,Iterator本身并不提供承载对象的能力。如果需要创建Iterator对象,则必须有一个被迭代的集合。

  • 集合对象每次调用iterator()方法都得到一个全新的迭代器对象,默认游标都在集合的第一个元素之前。

  • 迭代器内部定义了remove() :可以在遍历的时候,删除集合中的元素。此方法不同于集合直接调用remove()方法

    注意:

    • Iterator可以删除集合中的元素,但是遍历过程中通过迭代器对象的remove方法,不是集合对象的remove方法。
    • 如果还未调用next()或在上一次调用next方法之后已经调用了remove方法,再调用remove都会报IllegalStateException.
  • package src;
    
    import org.junit.Test;
    
    import java.util.ArrayList;
    import java.util.Collection;
    import java.util.Iterator;
    
    /**
     * @ClassName: IteratorTest
     * @Description: Java - Iterator迭代器
     * @author: zhilx (zhilx1997@sina.com)
     * @version: v1.0
     * @data: 2022/2/25 20:24
     * @node:
     *          - Iterator对象称为迭代器(设计模式的一种),主要用于遍历Collection集合中的元素。
     *          - **GOF给迭代器模式的定义为:提供一种方法访问一个容器(container)对象中的各个元素,而又不需暴露该对象的内部描述**。**迭代器模式,就是为容器而生。**
     *          - Collection接口继承了java.lang.Iterator接口,该接口有一个iterator()方法,那么所有实现了Collection接口的集合类都有一个iterator()方法,用以返回一个实现了Iterator接口的对象。
     *          - **Iterator仅用于遍历集合**,Iterator本身并不提供承载对象的能力。如果需要创建Iterator对象,则必须有一个被迭代的集合。
     *          - **集合对象每次调用iterator()方法都得到一个全新的迭代器对象**,默认游标都在集合的第一个元素之前。
     */
    public class IteratorTest {
        @Test
        public void test06() {
            // 15. Iterator迭代器:返回Iterator接口的实例,用于遍历集合元素。放在Iterator.java中
            Collection coll = new ArrayList();
            coll.add(123);
            coll.add(456);
            coll.add(new Person("jerry", 21));
            coll.add(new Person("Tom", 19));
            coll.add(new String("hello"));
            coll.add(false);
            System.out.println("coll = " + coll);
    
            // 使用Iterator迭代器对集合进行遍历
            Iterator iterator = coll.iterator();
    
            // 方式一:直接使用next()方法进行输出
            System.out.println("--------直接输出--------------");
            System.out.println(iterator.next()); // 123
            System.out.println(iterator.next()); // 456
            System.out.println(iterator.next()); // Jerry, 21
            System.out.println(iterator.next()); // Tom, 19
            System.out.println(iterator.next()); // hello
            System.out.println(iterator.next()); // false
    
            // System.out.println(iterator.next()); // 抛出异常java.util.NoSuchElementException,因为coll集合已经被遍历完成
    
            // 方式二:使用for循环(不推荐)
            System.out.println("-------------使用for循环(不推荐)-------------");
            Iterator iterator1 = coll.iterator();
            for (int i = 0; i < coll.size(); ++i) {
                System.out.println(iterator1.next());
            }
    
            // 方式三:使用hasNext()方法与while()调用(开发中优先使用该方法)
            System.out.println("---------使用hasNext()(优先使用)---------");
            Iterator iterator2 = coll.iterator();
            while(iterator2.hasNext()) {
                System.out.println(iterator2.next());
            }
    
        }
    
        @Test
        public void test07() {
            Collection coll = new ArrayList();
            coll.add(123);
            coll.add(456);
            coll.add(new Person("Tom", 19));
            coll.add(new String("hello"));
            coll.add(false);
    
            // 测试Iterator中的remove()方法:删除集合中的指定元素,和集合中的remove()方法不同
            // note: - Iterator可以删除集合中的元素,但是遍历过程中通过迭代器对象的remove方法,不是集合对象的remove方法。
            //       - 如果还未调用next()或在上一次调用next方法之后已经调用了remove方法,再调用remove都会报IllegalStateException.
            Iterator iterator = coll.iterator();
            while (iterator.hasNext()) {
                // iterator.remove(); // error, 不可以在next()方法之前调用remove()方法,因为此时iterator的指针可能为空
                Object obj = iterator.next();
                if (obj.equals("hello")) {
                    iterator.remove();
                    // iterator.remove(); // error, 此时当上一次调用之后,指针已经为空,再次调用将会报错
                }
            }
    
            iterator = coll.iterator();
            while (iterator.hasNext()) {
                System.out.println(iterator.next());
            }
            
            // JDK5.0之后新增了foreach来对集合和数组进行遍历,其底层也是Iterator
            System.out.println("--------foreach进行遍历--------------");
            for(Object c : coll) {
                System.out.println(c);
            }
    
            // note: 如果使用增强for循环,则此时会转换为Iterator,如果对数据进行修改不会发生变化
            int[] arr = new int[]{1,2,3,4,5};
            for (int i : arr) {
                i = 10; // 此时i为临时变量,当调用完成后就会进行释放,因此不会对原数组中的内容进行修改
            }
            for (int i : arr) {
                System.out.println(i); // 1 2 3 4 5
            }
        }
    }
    
    
  • hasNext() : 判断是否还有下一个元素

    while (iterator.hasNext()) {
    	// next()原理:指针下移;将下移以后集合位置上的元素返回
    	System.out.println(iterator.next());
    }
    

使用foreach循环遍历集合元素(增强for循环)

  • Java 5.0提供了foreach循环迭代方法Collection和数组。

  • 遍历操作不需要获取Collection或数组的长度,无序使用索引访问元素。

  • 遍历集合的底层调用Iterator完成操作。

  • foreach还可以用来遍历数组

  • // for(要遍历的元素类型 遍历后自定义元素名称 : 要遍历的结构名称)
    for (Person person: persons) {
    	System.out.println(person.getName());
    }
    

最后

以上就是糟糕裙子为你收集整理的java - Iterator迭代器和foreach遍历的全部内容,希望文章能够帮你解决java - Iterator迭代器和foreach遍历所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(37)

评论列表共有 0 条评论

立即
投稿
返回
顶部