Java 容器 --- 集合遍历的四种方式(传统循环/迭代器/增强for/forEach)

简介: Java 容器 --- 集合遍历的四种方式(传统循环/迭代器/增强for/forEach)

集合遍历的四种方式?



创建一个List集合:

public static void main(String[] args) {
    List<String> listNames = new ArrayList<>();
    listNames.add("qiuqiu");
    listNames.add("kaka");
    listNames.add("beibei");
    listNames.add("hutu");
    listNames.add("wangzai");
}


这个list包含我们小区的所有小狗的名字。注意在语句的右边<>的使用

ArrayList<>();


这个语法从Java7开始使用,允许我们以一种更严谨的方式声明泛型的集合,因为编译器可以从左边推测出右边的参数类型(因此叫做“类型引用”)


经典for循环


这种迭代方法在编程中非常熟悉,其中计数器变量从集合中的第一个元素运行到最后一个元素

for (int i = 0; i < listNames.size(); i++) {
    String name = listNames.get(i);
    System.out.println(name);
}


pros:


  • 这是编程中最熟悉的构造
  • 如果我们需要访问并使用计数器变量,比如打印小狗狗们的的数字顺序:1,2,3……


cons:


  • 使用计数器变量要求集合必须以基于索引的形式(如ArrayList)存储元素,并且我们必须提前知道集合的大小


迭代的方式


由于经典循环方式的限制,创建了使用迭代器的方式,这种方式允许我们迭代各种集合。


因此你可以看到Collection接口定义了每个集合必须实现iterator()方法,需要先创建迭代器对象。


在List上用迭代器遍历:

Iterator<String> itr = listNames.iterator();
while (itr.hasNext()) {
    String name = itr.next();
    System.out.println(name);
}


在Set上用迭代器遍历:

Set<String> set = new HashSet<>();
set.add("a");
set.add("b");
set.add("c");
set.add("d");
Iterator<String> itr = set.iterator();
while (itr.hasNext()) {
    String letter = itr.next();
    System.out.println(letter);
}


在Map上用迭代器遍历(迭代keySet()):

Map<String, Integer> grade = new HashMap<>();
grade.put("Operating System", 90);
grade.put("Computer Network", 92);
grade.put("Software Engineering", 90);
grade.put("Oracle", 90);
Iterator<String> itr = grade.keySet().iterator();
while (itr.hasNext()) {
    String key = itr.next();
    Integer value = grade.get(key);
    System.out.println(key + "=>" + value);
}


加强for循环


从Java 5开始,程序员可以使用一种更简洁的语法来遍历集合-加强for循环。

for (String s : listNames) {
    System.out.println(s);
}


注意:加强for循环实际上在背后使用的是迭代器。这意味着编译时Java编译器会将增强型for循环语法转换为迭代器构造。 新的语法为程序员提供了一种更方便的迭代集合的方式。


使用Lambda表达式的forEach


Java 8引入了Lambda表达式,介绍了一种遍历集合的全新方式-forEach方法

listNames.forEach(name -> System.out.println(name));


forEach方法与之前的方法最大的区别是什么?


在之前的方法中(经典for循环,迭代器和加强for循环),程序员可以控制集合是如何迭代的。迭代代码不是集合本身的一部分,它是由程序员编写的,因此称为外部迭代。


相比之下,新方法将迭代代码封装在集合本身中,因此程序员不必为迭代集合编写代码。 相反,程序员会在每次迭代中指定要做什么 - 这是最大的区别!


因此术语forEach内部迭代:集合处理迭代本身,而程序员传递动作 - 即每次迭代需要做的事情。

相关文章
|
3月前
|
Java 虚拟化 容器
(Java)Java里JFrame窗体的基本操作(容器布局篇-1)
容器 容器,我的理解是可以包容其他东西的玩意。它可以是一个盒子,可以是一个虚拟化的物品,可只要能包裹住其他存在质体的东西,那么都可以称作是容器。例如:JPanel组件和JScollPane组件两者都是容器也是组件。 既然有容器,那么容器中的布局就必不可少了。不然不规矩的摆放物品,人类看不习惯,我也看不习惯 ???? 本篇内容,将说明java JFrame窗体里容器中几类布局。 说明:所有在JFrame窗体里的容器布局都会使用setLayout()方法,采用的布局参数都将放进这个方法里 绝对布局 调用窗体容器
147 1
|
4月前
|
Java 大数据 API
Java Stream API:现代集合处理与函数式编程
Java Stream API:现代集合处理与函数式编程
299 100
|
4月前
|
Java API 数据处理
Java Stream API:现代集合处理新方式
Java Stream API:现代集合处理新方式
327 101
|
4月前
|
算法 Java
50道java集合面试题
50道 java 集合面试题
|
3月前
|
存储 算法 安全
Java集合框架:理解类型多样性与限制
总之,在 Java 题材中正确地应对多样化与约束条件要求开发人员深入理解面向对象原则、范式编程思想以及JVM工作机理等核心知识点。通过精心设计与周密规划能够有效地利用 Java 高级特征打造出既健壮又灵活易维护系统软件产品。
128 7
|
4月前
|
存储 Java Go
对比Java学习Go——函数、集合和OOP
Go语言的函数支持声明与调用,具备多返回值、命名返回值等特性,结合`func`关键字与类型后置语法,使函数定义简洁直观。函数可作为一等公民传递、赋值或作为参数,支持匿名函数与闭包。Go通过组合与接口实现面向对象编程,结构体定义数据,方法定义行为,接口实现多态,体现了Go语言的简洁与高效设计。
|
5月前
|
存储 NoSQL Java
Java Stream API:集合操作与并行处理
Stream API 是 Java 8 提供的集合处理工具,通过声明式编程简化数据操作。它支持链式调用、延迟执行和并行处理,能够高效实现过滤、转换、聚合等操作,提升代码可读性和性能。
|
5月前
|
Kubernetes Docker Python
Docker 与 Kubernetes 容器化部署核心技术及企业级应用实践全方案解析
本文详解Docker与Kubernetes容器化技术,涵盖概念原理、环境搭建、镜像构建、应用部署及监控扩展,助你掌握企业级容器化方案,提升应用开发与运维效率。
928 108