02Collection的遍历方式

发布时间 2023-10-30 13:03:48作者: ahssmy

Collection的遍历方式

  • 遍历器遍历
  • 增强for循环遍历
  • Lambda表达式遍历
  • 普通for只有List系列的才能用,Set用不了

一、迭代器遍历

  • iterator n.迭代器,迭代程序。

  • 迭代器不依赖索引。

  • 迭代器遍历就是把元素一个一个的获取出来

    01迭代器遍历

二、迭代器的Iterator类,和它的常用方法

  • 迭代器在java中的类是Iterator,迭代器是集合专用的遍历方式。

  • Collection集合获取迭代器:

    方法名称 说明
    Iterator iterator() 返回迭代器默认对象,默认指向当前集合的0索引

    迭代器常用方法:

    方法名称 说明
    boolean hasNext() 判断当前位置是否有元素,有元素返回true,没有元素返回false
    E next() 获取当前位置的元素,并将迭代器对象移向下一个位置。
  • 迭代器对象我们可以给它看作“光标,指针,箭头”,都无所谓。

    Iterator<String> it = list.iterator();:创建指针,获取迭代器,默认指向集合的0索引

    boolean flag = it.hasNext();:判断当前位置是否有元素。

    String str = it.next();:获取当前指向的元素,移动指针。

    Sysout.out.println(str);

  • 获取所用元素,可以利用循环:

    Iterator<String> it = list.iterator();
    while(it.hasNext()){
        String str = it.next();
        System.out.println(str);
    }
    

    案例:

    package com.mycollection;
    
    import java.util.ArrayList;
    import java.util.Collection;
    import java.util.Iterator;
    
    public class A03_CollectionDemo3 {
        /*
        Collection的遍历方式
             遍历器遍历
             增强for循环遍历
             Lambda表达式遍历
             普通for只有List系列的才能用,Set用不了
    
         迭代器遍历的三个方法:
             Iterator<String> it  = list.iterator();:创建指针,获取迭代器,默认指向集合的0索引
             boolean flag = it.hasNext();:判断当前位置是否有元素。
             String str = it.next();:获取当前指向的元素并移动指针。
         */
        public static void main(String[] args) {
            //1.创建集合并添加元素
            Collection<String> coll = new ArrayList<>();
            coll.add("aaa");
            coll.add("bbb");
            coll.add("ccc");
            coll.add("ddd");
    
            //2.获取迭代器对象
            //迭代器就好比一个箭头,默认指向集合的0索引处。
            Iterator<String> it = coll.iterator();
            //3.利用循环不断的去获取集合中的每一个元素
            while(it.hasNext()){
                String str = it.next();
                System.out.println(str);
            }
    
        }
    }
    

    1

三、注意细节点

  1. 报错:NoSuchElementException :没有这个元素,异常
  2. 迭代器遍历完毕,指针不会复位,要想再次遍历,只能重新获取一次新的迭代器的对象。
  3. 循环中只能用一次next方法,不能用多次。
  4. 迭代器遍历时,不能用集合的方法进行增加或者删除

案例:

package com.mycollection;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;

public class A04_CollectionDemo4 {
    /*
        1. 报错:NoSuchElementException :没有这个元素,异常
        2. 迭代器遍历完毕,指针不会复位,要想再次遍历,只能重新获取一次新的迭代器的对象。
        3. 循环中只能用一次next方法,不能用多次。
        4. 迭代器遍历时,不能用集合的方法进行增加或者删除
     */
    public static void main(String[] args) {
        //1.创建集合并添加元素
        Collection<String> coll = new ArrayList<>();
        coll.add("aaa");
        coll.add("bbb");
        coll.add("ccc");
        coll.add("ddd");

        //2.获取迭代器对象
        //迭代器就好比一个箭头,默认指向集合的0索引处。
        Iterator<String> it = coll.iterator();
        //3.利用循环不断的去获取集合中的每一个元素
        while(it.hasNext()){
            String str = it.next();
            System.out.println(str);
        }
        //当上面循环结束了之后,迭代器的指针已经指向了最后没有元素的位置。
        //System.out.println(it.next()); //会报错:NoSuchElementException

        //迭代器遍历完毕,指针不会复位。
        System.out.println(it.hasNext());//false
        //System.out.println(it.hasNext());//false
        //System.out.println(it.hasNext());//false

        //如果说要继续第二次遍历集合,只能再次获取一个新的迭代器对象。
        Iterator<String> it2 = coll.iterator(); //跟上面是两个互相独立的迭代器对象。
        while(it2.hasNext()){
            String str = it2.next();
            System.out.println(str);
        }


    }
}

运行结果:

2

  • next(),可以移动指针,用第一次移动了一个指针,用多次移动了多次指针,所以hasNext()和next是配套的,否则可能会报:NoSuchElementException。

    案例:

    package com.mycollection;
    
    import java.util.ArrayList;
    import java.util.Collection;
    import java.util.Iterator;
    
    public class A05_CollectionDemo5 {
        /*
            1. 报错:NoSuchElementException :没有这个元素,异常
            2. 迭代器遍历完毕,指针不会复位,要想再次遍历,只能重新获取一次新的迭代器的对象。
            3. 循环中只能用一次next方法,不能用多次。
            4. 迭代器遍历时,不能用集合的方法进行增加或者删除
         */
        public static void main(String[] args) {
            //1.创建集合并添加元素
            Collection<String> coll = new ArrayList<>();
            coll.add("aaa");
            coll.add("bbb");
            coll.add("ccc");
            coll.add("ddd");
            coll.add("eee");
    
            //2.获取迭代器对象
            //迭代器就好比一个箭头,默认指向集合的0索引处。
            Iterator<String> it = coll.iterator();
            //3.利用循环不断的去获取集合中的每一个元素
            while(it.hasNext()){
                //4.next方法的两件事情:获取元素并移动指针。
                System.out.println(it.next());
                System.out.println(it.next());
            }
        }
    }
    

    运行结果:

    3

  • 迭代器遍历时,不能用集合的方法进行增加或者删除

    • 这个暂时当一个结论先行记忆
    • 如果我实在要删除:那么可以用迭代器提供的remove方法进行删除。
    • 如果要添加,暂时没有办法。

    案例:

    package com.mycollection;
    
    import java.util.ArrayList;
    import java.util.Collection;
    import java.util.Iterator;
    
    public class A05_CollectionDemo5 {
        /*
            1. 报错:NoSuchElementException :没有这个元素,异常
            2. 迭代器遍历完毕,指针不会复位,要想再次遍历,只能重新获取一次新的迭代器的对象。
            3. 循环中只能用一次next方法,不能用多次。
            4. 迭代器遍历时,不能用集合的方法进行增加或者删除
         */
        public static void main(String[] args) {
            //1.创建集合并添加元素
            Collection<String> coll = new ArrayList<>();
            coll.add("aaa");
            coll.add("bbb");
            coll.add("ccc");
            coll.add("ddd");
            coll.add("eee");
    
            //2.获取迭代器对象
            //迭代器就好比一个箭头,默认指向集合的0索引处。
            Iterator<String> it = coll.iterator();
            //3.利用循环不断的去获取集合中的每一个元素
            while(it.hasNext()){
                String str = it.next();
                if("bbb".equals(str)){
                    coll.remove("bbb");
                }
                System.out.println(str);
            }
        }
    }
    

    运行结果:ConcurrentModificationException :并发修改异常

    4

    • 不能用集合中的方法删除,但是可以用迭代器中的方法删除。
    package com.mycollection;
    
    import java.util.ArrayList;
    import java.util.Collection;
    import java.util.Iterator;
    
    public class A05_CollectionDemo5 {
        /*
            1. 报错:NoSuchElementException :没有这个元素,异常
            2. 迭代器遍历完毕,指针不会复位,要想再次遍历,只能重新获取一次新的迭代器的对象。
            3. 循环中只能用一次next方法,不能用多次。
            4. 迭代器遍历时,不能用集合的方法进行增加或者删除
         */
        public static void main(String[] args) {
            //1.创建集合并添加元素
            Collection<String> coll = new ArrayList<>();
            coll.add("aaa");
            coll.add("bbb");
            coll.add("ccc");
            coll.add("ddd");
            coll.add("eee");
    
            //2.获取迭代器对象
            //迭代器就好比一个箭头,默认指向集合的0索引处。
            Iterator<String> it = coll.iterator();
            //3.利用循环不断的去获取集合中的每一个元素
            while(it.hasNext()){
                //4.next方法的两件事情:获取元素并移动指针。
                //System.out.println(it.next());
    
                String str = it.next();
                if("bbb".equals(str)){
                    //coll.remove("bbb");
                    //不能用集合中的方法删除,但是可以用迭代器中的方法删除。
                    it.remove();
                }
            }
            System.out.println(coll);
        }
    }
    

    运行结果:

    5

四、总结

  1. 迭代器在遍历集合的时候是不依赖索引的。

  2. 迭代器需要掌握三个方法:

    Iterator<String> it = list.iterator();
    while(it.hasNext()){
        String str = it.next();
        System.out.println(str);
    }
    
  3. 迭代器的四个细节:

    • 如果当前位置没有元素,还要强行获取,会包NoSuchElementException
    • 迭代器遍历完毕,指针不会复位。
    • 循环中只能用一次next方法。
    • 迭代器遍历是,不用集合的方法对集合本身进行增加或者删除,但是遍历之后可以。