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

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
简介: 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内部迭代:集合处理迭代本身,而程序员传递动作 - 即每次迭代需要做的事情。

相关文章
|
2月前
|
Java 程序员 API
Java循环操作哪个快?
本文探讨了Java中stream API与传统for循环在性能上的对比,通过多个示例分析了不同场景下两者的优劣。作者指出,尽管stream API使代码更简洁,但不当使用会降低可读性和性能,特别是在处理大数据量时。实验结果显示,在多数情况下,普通for循环的性能优于stream API,尤其是在单次操作耗时较短但需多次执行的场景中。文章建议开发者在设计初期就考虑全局流程,避免重复使用stream流,以提升代码质量和性能。
Java循环操作哪个快?
|
2月前
|
Java 程序员 API
Java循环操作哪个快?
本文探讨了Java中Stream API与传统for循环的性能对比及适用场景。作者通过实际案例分析,指出在某些情况下,过度使用Stream API会导致代码可读性和维护性下降。测试结果显示,在数据量较小的情况下,普通for循环的性能优于Stream API,尤其是在涉及多次类似操作时。因此,建议在开发中根据具体需求选择合适的遍历方式,以提高代码的可读性和性能。
Java循环操作哪个快?
|
2月前
|
存储 安全 Java
Java多线程编程中的并发容器:深入解析与实战应用####
在本文中,我们将探讨Java多线程编程中的一个核心话题——并发容器。不同于传统单一线程环境下的数据结构,并发容器专为多线程场景设计,确保数据访问的线程安全性和高效性。我们将从基础概念出发,逐步深入到`java.util.concurrent`包下的核心并发容器实现,如`ConcurrentHashMap`、`CopyOnWriteArrayList`以及`BlockingQueue`等,通过实例代码演示其使用方法,并分析它们背后的设计原理与适用场景。无论你是Java并发编程的初学者还是希望深化理解的开发者,本文都将为你提供有价值的见解与实践指导。 --- ####
|
2月前
|
存储 Java 开发者
在 Java 中,如何遍历一个 Set 集合?
【10月更文挑战第30天】开发者可以根据具体的需求和代码风格选择合适的遍历方式。增强for循环简洁直观,适用于大多数简单的遍历场景;迭代器则更加灵活,可在遍历过程中进行更多复杂的操作;而Lambda表达式和`forEach`方法则提供了一种更简洁的函数式编程风格的遍历方式。
|
3月前
|
算法 Java 测试技术
🧑‍💻Java零基础:Java 的循环退出语句 break
【10月更文挑战第16天】本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
75 6
|
3月前
|
Java 程序员 编译器
Java|如何正确地在遍历 List 时删除元素
从源码分析如何正确地在遍历 List 时删除元素。为什么有的写法会导致异常,而另一些不会。
57 3
|
3月前
|
Java 测试技术 数据安全/隐私保护
📖Java零基础-while循环语句的深度解析
【10月更文挑战第6天】本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
56 1
|
3月前
|
传感器 Java 测试技术
📖Java零基础-do-while循环语句的深入剖析
【10月更文挑战第5天】本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
43 1
|
3月前
|
前端开发 小程序 Java
java基础:map遍历使用;java使用 Patten 和Matches 进行正则匹配;后端传到前端展示图片三种情况,并保存到手机
这篇文章介绍了Java中Map的遍历方法、使用Pattern和matches进行正则表达式匹配,以及后端向前端传输图片并保存到手机的三种情况。
32 1
|
3月前
|
消息中间件 NoSQL Kafka
Flink-10 Flink Java 3分钟上手 Docker容器化部署 JobManager TaskManager Kafka Redis Dockerfile docker-compose
Flink-10 Flink Java 3分钟上手 Docker容器化部署 JobManager TaskManager Kafka Redis Dockerfile docker-compose
78 4