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

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);
        }
    }
    
    
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,830评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,992评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,875评论 0 331
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,837评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,734评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,091评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,550评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,217评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,368评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,298评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,350评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,027评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,623评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,706评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,940评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,349评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,936评论 2 341

推荐阅读更多精彩内容