【从零开始学Java | 第二十一篇】Collection的遍历方式

目录

前言

一、迭代器遍历

1.使用方式

2.细节点

小结

二、增强for遍历

1.使用方式

2.细节点

三、Lambda表达式遍历

1.使用方式

总结


前言

我们之前使用的for遍历方式是通过索引来遍历的,但是我们现在学习的Collection集合体系中的Set系列集合并没有索引,那么我们应该如何去遍历Collection集合体系中的系列集合呢?Java 为我们提供了三种通用的遍历

  1. 迭代器遍历
  2. 增强for遍历
  3. Lambda表达式遍历

一、迭代器遍历

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

Collection集合获取迭代器:

java 复制代码
Iterator<E> iterator()    返回迭代器对象,默认指向当前集合的0索引

Iterator中的常用方法:

java 复制代码
boolean hasNext()    判断当前位置是否有元素,有元素返回true,无元素返回false。
E next()    获取当前位置的元素,并将迭代器对象移向下一个位置。

1.使用方式

java 复制代码
import java.util.ArrayList;
import java.util.Iterator;

public class IteratorDemo01 {
    public static void main(String[] args) {
        ArrayList<String> al = new ArrayList<>();
        al.add("Java");
        al.add("C++");
        al.add("Python");
        al.add("MySql");

        Iterator<String> it = al.iterator();

        while(it.hasNext()){
            String str = it.next();
            System.out.println(str);
        }
    }
}

运行结果:

2.细节点

  • 运行到没有元素的位置时,如果强行调用next方法,会报NoSuchElementException异常。
  • 迭代器遍历完毕后,指针不会复位
  • 循环中只能用一次next方法。
  • 迭代器遍历时,不能用集合的方法进行增加或者删除

由此看出迭代器并不会复位,以及如果强行调用next方法,会报NoSuchElementException异常。

如果我们要继续第二次遍历集合,只能再次获取一个新的迭代器对象

当我们使用Collection自带的删除方法时

java 复制代码
public class IteratorDemo01 {
    public static void main(String[] args) {
        Collection<String> al = new ArrayList<>();
        al.add("Java");
        al.add("C++");
        al.add("Python");
        al.add("MySql");

        Iterator<String> it = al.iterator();

        while(it.hasNext()){
            String str = it.next();
            if("C++".equals(str)){
                al.remove("C++");
            }
        }
        System.out.println(al);

    }
}

正确方式:it.remove();

小结

  • 迭代器在遍历集合时是不依赖索引
  • 迭代器需要掌握的三个方法
  • 迭代器的四个细节

二、增强for遍历

增强for的底层就是迭代器,是为了简化迭代器的代码而出现的。

所有的单列集合和数组才能用增强for进行遍历。

格式:

for(元素的数据类型 变量名:数组或者集合){

}

1.使用方式

java 复制代码
public class IteratorTest01 {
    public static void main(String[] args) {
        Collection<String> coll = new ArrayList<>();
        coll.add("aaa");
        coll.add("bbb");
        coll.add("ccc");
        coll.add("ddd");
        coll.add("eee");

        for(String str : coll){
            System.out.println(str);
        }
    }
}

运行结果:

2.细节点

  • 修改增强for中的变量,不会改变集合中原本的数据。因为我们设置的访问的变量只是一个第三方变量,修改第三方变量并不会将源数据改变。

三、Lambda表达式遍历

得益于JDK 8开始的新技术Lambda表达式,提供了一种更简单、更直接的遍历集合的方式。

方法:

default void forEach(Consumer<? super T> action):

1.使用方式

java 复制代码
// 第一阶段:匿名内部类
list.forEach(new Consumer<String>() {
    @Override
    public void accept(String s) {
        System.out.println(s);
    }
});

// 第二阶段:砍掉 new 接口、Override 那些废话
// 编译器:我知道这里需要一个 Consumer,而且 Consumer 只有 accept 这一个方法。
list.forEach( (String s) -> { System.out.println(s); } );

// 第三阶段:砍掉参数类型
// 编译器:list 集合存的是 String,我当然知道传进来的 s 是 String 类型。
list.forEach( (s) -> { System.out.println(s); } );

// 第四阶段:如果参数只有一个,大括号只有一行代码,砍掉参数小括号、核心代码大括号和分号。
// 终极形态:Lambda 表达式
list.forEach(s -> System.out.println(s));
  • () :方法的参数列表。如果没有参数,写空括号 ()。如果只有一个参数,可以不写括号 s

  • ->:Lambda 操作符,读作"goes to "或者"由它引出"。它把参数和核心逻辑连接起来。

  • {}:方法体(核心逻辑)。如果只有一行代码,可以不写大括号、return 和分号。

总结

  • 迭代器:在遍历的过程中需要删除元素,请使用迭代器。
  • 增强for、Lambda:仅仅想遍历,那么使用增强for、Lambda表达式。
相关推荐
星恒随风2 小时前
C++ STL 详解:list 的使用、迭代器失效、模拟实现与 vector 对比
开发语言·数据结构·c++·笔记·学习·list
梅梅绵绵冰2 小时前
算法题-矩阵
数据结构·算法·矩阵
奋发向前wcx14 小时前
y1,y2总复习笔记5 2026.7.19
数据结构·笔记·算法
ChaoZiLL18 小时前
我的数据结构4-栈和队列
数据结构
miller-tsunami18 小时前
顺序表相关知识点
数据结构·顺序表
华玥作者21 小时前
uniapp 万条数据不卡顿:我写了个虚拟列表组件 hy-list,原生支持瀑布流
数据结构·uni-app·list·vue3
2401_8414956421 小时前
【数据结构】B*树
数据结构·c++·b树·算法·删除·插入·三分分裂
晚笙coding21 小时前
LeetCode 108:将有序数组转换为二叉搜索树 —— 从数组到平衡二叉树的递归构造
数据结构·算法·leetcode
不如语冰1 天前
AI大模型入门-模块导入import
数据结构·人工智能·pytorch·python
岑梓铭1 天前
《考研408数据结构》第七章(7.1 查找:顺序查找、折半查找、分块查找)复习笔记
数据结构·笔记·考研·408·ds·查找