美文网首页
36.集合:Collection集合的遍历形式

36.集合:Collection集合的遍历形式

作者: 每天起床都想摆 | 来源:发表于2022-03-08 09:19 被阅读0次

    Collection集合的遍历形式

    方式一:迭代器

    迭代器概述

    • 遍历就是一个一个的把容器中的元素访问一遍
    • 迭代器在java中的代表是Iterator,迭代器是集合的专用遍历方式

    迭代器获取及常用方法

    Collection集合获取迭代器

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

    Iterator中的常用方法

    方法名称 说明
    boolean hasNext() 询问当前位置是否有元素存在,存在返回true,不存在返回false
    E next() 获取当前位置的元素,并同时将迭代器对象移向下一个位置,注意防止取出越界

    测试代码

    package com.java.collection;
    
    import java.util.ArrayList;
    import java.util.Collection;
    import java.util.Iterator;
    
    /**
     * 使用迭代器获取集合元素
     */
    public class CollectionDemo03 {
        public static void main(String[] args) {
            Collection<String> lists = new ArrayList<>();
            lists.add("吴亦凡");
            lists.add("华晨宇");
            lists.add("陈冠希");
            lists.add("张柏芝");
            System.out.println(lists);
    
            // 1. 得到当前集合的迭代器对象
            Iterator<String> it = lists.iterator();
    /*      String e = it.next();
            System.out.println(e);
            System.out.println(it.next());*/
            //next()每次成功访问元素后就会移动到下一个元素的位置,因此要谨防越界问题
    /*      System.out.println(it.next());
            System.out.println(it.next());*/
            //System.out.println(it.next());  NoSuchElementException,出现无此元素异常
    
            // 2.定义While循环,使用hasNext()判断是否有元素,有就进入循环使用next()取出来
            while (it.hasNext()) {
                System.out.println(it.next());  
                // 一个循环下不能出现两个next语句 否则会因为数组元素是奇数是发生如上异常
            }
    
        }
    }
    
    
    • 注意事项

      1. next()每次成功访问元素后就会移动到下一个元素的位置,因此要谨防越界问题
      2. 一个循环下不能出现两个next语句 否则会因为数组元素是奇数是发生如上异常
    • 核心代码

      // 1. 得到当前集合的迭代器对象
      Iterator<String> it = lists.iterator();
      // 2.定义While循环,使用hasNext()判断是否有元素,有就进入循环使用next()取出来
      while (it.hasNext()) {
      System.out.println(it.next());  
      // 一个循环下不能出现两个next语句 否则会因为数组元素是奇数是发生如上异常
      }
      

    方式二:foreach/增强for循环

    增强for循环概述

    • 增强for循环:既可以遍历集合,也可以遍历数组
    • 它是JDK5之后出现的,其内部原理是一个Iterator迭代器,遍历集合相当于是迭代器的简化写法
    • 实现Iterable接口的类才可以使用迭代器和增强for,Collection接口已经实现了Iterable接口

    格式

    for(元素数据类型 变量名 : 数组或者Collection集合){
        // 在此处使用变量即可,这变量就是元素
    }
    

    示例

    Collection<String> list = new ArrayList<>();
    ... ...
    for(String ele : list){
        System.out.println(ele);
    }
    

    测试代码

    package com.java.collection;
    
    import java.util.ArrayList;
    import java.util.Collection;
    
    /**
     * 使用增强for循环(又称foreach)获取集合元素
     */
    public class CollectionDemo04 {
        public static void main(String[] args) {
            Collection<String> lists = new ArrayList<>();
            lists.add("吴亦凡");
            lists.add("华晨宇");
            lists.add("陈冠希");
            lists.add("张柏芝");
            System.out.println(lists);
    
            for (String ele : lists) {
                System.out.println(ele);
            }
    
            // 尝试遍历数组
            int[] scores = new int[]{100, 200, 300, 400, 500};
            for (int s : scores) {
                System.out.println(s);
            }
        }
    }
    
    
    • 注意随事项

      • 对于增强for循环而言,以上述测试代码中数组测试为例:int s 和scores是有区别的,其中s的作用类似于result,起到接收的作用,是单独定义存在的变量,和数组的元素无关,因此,修改s的值不会影响到数组中的内容

      • int[] scores = new int[]{100, 200, 300, 400, 500};
        for (int s : scores) {
            System.out.println(s);
            if (s == 200) {
                s = 10;             // 修改无意义,不会影响数组的元素
            }
        }
        System.out.println(Arrays.toString(scores));
        

    方式三:Lambda表达式

    • Collection结合Lambda遍历的API

      方法名称 说明
      default void forEach(Consumer<? super T> action): 结合Lambda遍历集合
    • 测试代码

      package com.java.collection;
      
      import java.util.ArrayList;
      import java.util.Collection;
      
      /**
       * 结合Lambda遍历集合
       */
      public class CollectionDemo05 {
          public static void main(String[] args) {
              Collection<String> lists = new ArrayList<>();
              lists.add("吴亦凡");
              lists.add("华晨宇");
              lists.add("陈冠希");
              lists.add("张柏芝");
              System.out.println(lists);
      
              // forEach源码
      /*
              default void forEach(Consumer<? super T> action) {
                  Objects.requireNonNull(action);
                  for (T t : this) {
                      action.accept(t);
                  }
              }
      */
      
      
      /*      lists.forEach(new Consumer<String>() {
                  @Override
                  public void accept(String s) {
                      System.out.println(s);
                  }
              });*/
      
      /*      lists.forEach(s -> {
                      System.out.println(s);
      
              });*/
      
              lists.forEach(s -> System.out.println(s));
      
      
              // 现在的新技术:冒号引用,将上述代码继续简化
              lists.forEach(System.out::println);
          }
      }
      
      

    相关文章

      网友评论

          本文标题:36.集合:Collection集合的遍历形式

          本文链接:https://www.haomeiwen.com/subject/bdzvrrtx.html