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内部迭代:集合处理迭代本身,而程序员传递动作 - 即每次迭代需要做的事情。

相关文章
|
14天前
|
Java 程序员 API
Java循环操作哪个快?
本文探讨了Java中Stream API与传统for循环的性能对比及适用场景。作者通过实际案例分析,指出在某些情况下,过度使用Stream API会导致代码可读性和维护性下降。测试结果显示,在数据量较小的情况下,普通for循环的性能优于Stream API,尤其是在涉及多次类似操作时。因此,建议在开发中根据具体需求选择合适的遍历方式,以提高代码的可读性和性能。
Java循环操作哪个快?
|
15天前
|
Java
Java 8 引入的 Streams 功能强大,提供了一种简洁高效的处理数据集合的方式
Java 8 引入的 Streams 功能强大,提供了一种简洁高效的处理数据集合的方式。本文介绍了 Streams 的基本概念和使用方法,包括创建 Streams、中间操作和终端操作,并通过多个案例详细解析了过滤、映射、归并、排序、分组和并行处理等操作,帮助读者更好地理解和掌握这一重要特性。
25 2
|
14天前
|
安全 Java
Java多线程集合类
本文介绍了Java中线程安全的问题及解决方案。通过示例代码展示了使用`CopyOnWriteArrayList`、`CopyOnWriteArraySet`和`ConcurrentHashMap`来解决多线程环境下集合操作的线程安全问题。这些类通过不同的机制确保了线程安全,提高了并发性能。
|
19天前
|
存储 Java
判断一个元素是否在 Java 中的 Set 集合中
【10月更文挑战第30天】使用`contains()`方法可以方便快捷地判断一个元素是否在Java中的`Set`集合中,但对于自定义对象,需要注意重写`equals()`方法以确保正确的判断结果,同时根据具体的性能需求选择合适的`Set`实现类。
|
19天前
|
存储 Java 开发者
在 Java 中,如何遍历一个 Set 集合?
【10月更文挑战第30天】开发者可以根据具体的需求和代码风格选择合适的遍历方式。增强for循环简洁直观,适用于大多数简单的遍历场景;迭代器则更加灵活,可在遍历过程中进行更多复杂的操作;而Lambda表达式和`forEach`方法则提供了一种更简洁的函数式编程风格的遍历方式。
|
19天前
|
Java 开发者
|
19天前
|
存储 Java 开发者
Java中的集合框架深入解析
【10月更文挑战第32天】本文旨在为读者揭开Java集合框架的神秘面纱,通过深入浅出的方式介绍其内部结构与运作机制。我们将从集合框架的设计哲学出发,探讨其如何影响我们的编程实践,并配以代码示例,展示如何在真实场景中应用这些知识。无论你是Java新手还是资深开发者,这篇文章都将为你提供新的视角和实用技巧。
18 0
|
3月前
|
安全 算法 Java
【Java集合类面试二】、 Java中的容器,线程安全和线程不安全的分别有哪些?
这篇文章讨论了Java集合类的线程安全性,列举了线程不安全的集合类(如HashSet、ArrayList、HashMap)和线程安全的集合类(如Vector、Hashtable),同时介绍了Java 5之后提供的java.util.concurrent包中的高效并发集合类,如ConcurrentHashMap和CopyOnWriteArrayList。
【Java集合类面试二】、 Java中的容器,线程安全和线程不安全的分别有哪些?
|
6月前
|
安全 算法 Java
安全无忧:Java并发集合容器的应用与实践
安全无忧:Java并发集合容器的应用与实践
48 0
安全无忧:Java并发集合容器的应用与实践
|
6月前
|
存储 算法 Java
盘点Java集合(容器)概览,Collection和Map在开发中谁用的最多?
盘点Java集合(容器)概览,Collection和Map在开发中谁用的最多?
63 0
下一篇
无影云桌面