首页 > 编程语言 >【Java核心基础】Java中foreach方法核心总结

【Java核心基础】Java中foreach方法核心总结

时间:2023-12-28 11:06:18浏览次数:33  
标签:遍历 Java String 核心 元素 循环 foreach public

【Java核心基础】Java中foreach方法核心总结 - 程序员古德

Java中的foreach循环适用于多种场景:遍历数组、集合框架、处理列表数据等,可替代传统for循环,使代码更简洁。结合Lambda表达式和Stream API,可实现声明式数据处理,虽然不能直接遍历Map的键值对,但可遍历键或值集合,在多线程环境下,结合并行流使用foreach可并行处理数据。使用foreach能简化代码逻辑,提高可读性,减少出错。

定义

【Java核心基础】Java中foreach方法核心总结 - 程序员古德

Foreach循环在编程中展现出强大的便利性和实用性,无论是处理基本类型还是对象数组,它都能够轻松遍历每一个元素,在Java的集合框架(如ArrayList、LinkedList、HashSet等)中,foreach更是简化了遍历过程,无需依赖迭代器或索引。对于用户输入、数据库查询结果或API响应等列表数据的处理,foreach循环也能轻松应对,迭代每个数据项。

在某些特定场景下,foreach循环具有明显的优势。如:当我们的关注点在于元素本身而非其索引时,它可以作为传统for循环的替代选项,使代码更为简洁。同时,Java 8引入的Lambda表达式和Stream API常常与foreach协同工作,以声明式的方式处理集合数据,进一步提升代码效率和可读性。虽然foreach不能直接遍历Map的键值对,但我们可以分别遍历Map的键或值集合,在多线程环境下的集合元素并行处理需求中,foreach也可以与并行流(parallel streams)相结合使用,实现高效的并行处理。

采用foreach循环不仅简化了遍历操作,同时对代码质量也能产生积极的影响。使用foreach可以使代码更加简洁、易读,从而降低出错的可能性。

代码案例

【Java核心基础】Java中foreach方法核心总结 - 程序员古德

场景一:遍历数组,遍历一个整数数组并打印每个元素,如下代码:

public class ForeachExample {  
    public static void main(String[] args) {  
        int[] numbers = {1, 2, 3, 4, 5};  
  
        // 使用foreach循环遍历数组  
        for (int number : numbers) {  
            System.out.println(number);  
        }  
    }  
}

在这个例子中,我们使用foreach循环来遍历一个整数数组。for (int number : numbers)这行代码中的number是数组numbers中当前遍历到的元素。循环体会依次执行,打印出数组中的每个元素。

场景二:遍历集合,遍历一个ArrayList并打印每个元素,如下代码:

import java.util.ArrayList;  
  
public class ForeachExample {  
    public static void main(String[] args) {  
        ArrayList<String> fruits = new ArrayList<>();  
        fruits.add("Apple");  
        fruits.add("Banana");  
        fruits.add("Cherry");  
  
        // 使用foreach循环遍历集合  
        for (String fruit : fruits) {  
            System.out.println(fruit);  
        }  
    }  
}

这个例子展示了如何使用foreach循环来遍历一个ArrayListfor (String fruit : fruits)这行代码中的fruit是集合fruits中当前遍历到的元素。循环体会依次执行,打印出集合中的每个元素。

场景三:处理用户输入,处理用户输入的字符串数组,并打印每个字符串的长度,如下代码:

import java.util.Scanner;  
  
public class ForeachExample {  
    public static void main(String[] args) {  
        Scanner scanner = new Scanner(System.in);  
        System.out.print("Enter strings separated by spaces: ");  
        String[] inputs = scanner.nextLine().split(" ");  
  
        // 使用foreach循环处理用户输入  
        for (String input : inputs) {  
            System.out.println("Length of '" + input + "': " + input.length());  
        }  
    }  
}

在这个例子中,我们使用foreach循环来处理用户输入的字符串数组。我们首先使用Scanner类获取用户输入,然后使用split方法将输入字符串拆分成一个字符串数组。接着,我们使用foreach循环遍历这个数组,并打印出每个字符串的长度。

场景四:遍历Map的键或值,遍历一个HashMap的键,并打印每个键及其对应的值,如下代码:

import java.util.HashMap;  
import java.util.Map;  
  
public class ForeachExample {  
    public static void main(String[] args) {  
        HashMap<String, Integer> ages = new HashMap<>();  
        ages.put("Alice", 25);  
        ages.put("Bob", 30);  
        ages.put("Charlie", 35);  
  
        // 使用foreach循环遍历Map的键  
        for (String name : ages.keySet()) {  
            System.out.println(name + ": " + ages.get(name));  
        }  
    }  
}

这个例子中,展示了如何使用foreach循环来遍历一个HashMap的键。我们首先使用keySet方法获取Map中所有的键,然后使用foreach循环遍历这些键,并通过键来获取对应的值,最后打印出每个键及其对应的值。注意,这里我们不能直接使用for (Map.Entry<String, Integer> entry : ages)来同时遍历键和值,因为那样会抛出编译错误。在Java 8及更高版本中,可以使用forEach方法和Lambda表达式来实现这个功能。

场景五:遍历Map的键或值遍历字符串并统计字符出现次数,如下代码:

public class Main {
    public static void main(String[] args) {
        String str = "hello world";
        int[] charCount = new int[26]; // 假设只有小写字母

        // 使用foreach遍历字符串并统计字符出现次数
        for (char c : str.toCharArray()) {
            if (c >= 'a' && c <= 'z') {
                charCount[c - 'a']++;
            }
        }

        // 输出字符出现次数
        for (int i = 0; i < charCount.length; i++) {
            if (charCount[i] > 0) {
                System.out.println((char) (i + 'a') + ": " + charCount[i]);
            }
        }
    }
}

核心总结

【Java核心基础】Java中foreach方法核心总结 - 程序员古德

实现原理

在Java集合框架中,Iterable接口和Iterator接口是实现foreach循环的基础,如下:

  1. Iterable接口:在Java中,如果一个类想要被foreach循环遍历,那么它必须实现Iterable接口,这个接口定义了一个方法iterator(),它返回一个Iterator对象,用于遍历集合中的元素。
  2. Iterator接口:Iterator是一个用于遍历集合的通用接口,它提供了三个主要方法:
    1. hasNext():检查是否还有下一个元素。
    2. next():返回当前元素并将迭代器向下移动一个元素。
    3. remove():移除迭代器最后返回的元素(可选操作,很多实现并不支持)。

当我们编写一个foreach循环时,例如for(ElementTypeelement:collection),编译器实际上会将其转化为使用Iterator的方式进行处理。

在这个过程中,首先会在循环开始前调用集合的iterator()方法来获取一个Iterator对象,然后,在每次循环迭代中,会通过调用Iterator的hasNext()方法来检查是否存在更多的元素,如果存在,就调用next()方法获取下一个元素,并将其赋值给循环变量(如本例中的element)。这一过程会持续进行,直到Iterator没有更多的元素(即hasNext()返回false),此时循环就会结束。

在JVM层面,针对foreach循环也有一些优化措施。例如,JVM的即时编译器(JIT)能够对频繁执行的代码片段进行热点优化,将其编译为机器码,从而提升执行效率。

使用建议

在实际开发过程中,foreach循环特别适用于那些仅需遍历集合或数组并读取元素的操作,它使代码更简洁,可读性更强。在多线程环境下使用foreach循环时,我们必须警惕并发修改的问题,可以采用并发集合或同步块等策略来确保数据的一致性和安全性。此外,对于处理大型数据集或追求高性能的场景,传统的for循环在某些情况下可能比foreach循环更具效率。

关注我,每天学习互联网编程技术 - 程序员古德

标签:遍历,Java,String,核心,元素,循环,foreach,public
From: https://blog.51cto.com/bytegood/9010993

相关文章

  • 详解Java编写并运行spark应用程序的方法WordCount_tyt2023
    SparkContext:通往Spark集群的入口点,用于创建RDD和广播变量等RDD:弹性分布式数据集,Spark应用程序的核心抽象Transformation:操作RDD生成新的RDD,如map、filter等Action:对RDD的操作,如count、collect等 环境:SparkStandalone模式目标:计算文本文件中所有单词的出现频率输入文......
  • 2017 《Java 2实用教程(第5版)》是由耿祥义、张跃平编著
    我的研究生同学河南老乡河南工业大学Jackso_hao大学期间学习的Java教材  《Java2实用教程(第5版)》是由耿祥义、张跃平编著,2017年清华大学出版社出版的高等学校Java课程系列教材、普通高等教育“十一五”国家级规划教材。该教材既可作为高等院校相关专业Java程序设计的教材......
  • java的启动脚本
    java的启动脚本:run_java.sh脚本内容: -设置工作目录-设置必要的环境变量-设置JVM运行参数-运行程序创建运行脚本:使用run_java.sh来运行java程序1.修改run_.sh2.转成UNIX风格3.上传至Linux 4.添加+x权限,运行脚本 ......
  • 无涯教程-Java泛型 - 映射(Map)
    Java在Map接口中提供了泛型支持。GenericMap-语法Map<T>map=newHashMap<T>();map-Map接口的对象。T   -集合声明期间传递的泛型类型参数。T是传递给泛型接口Map及其实现类HashMap的类型参数。packagecom.learnfk;importjava.util.HashMap;importj......
  • java进行数据库操作的并发控制的2种方法
    本文分享自华为云社区《java进行数据库操作的并发控制》,作者:张俭。在现代应用编码中,从数据库里面find出来,进行一些业务逻辑操作,最后再save回去。即:Personperson=personRepo.findById(id);person.setAge(18);personRepo.save(person);但是这样的业务操作,如果一个线程修改......
  • java8 新特性(二)CompletableFuture类
    CompletableFuture是Java8中引入的一个新特性,它表示异步计算的结果。通过使用CompletableFuture,可以方便地处理异步计算,并能够在计算完成后执行回调函数。CompletableFuture是Java8中引入的一个功能强大的类,它实现了Future接口,并在此基础上进行了丰富的扩展,以简化异步编程的复......
  • 无涯教程-Java泛型 - 有界类型
    有时您可能想限制参数的类型,如对数字进行操作的方法可能只希望接受Number或其子类的,这就是有界类型参数的用途,使用extends实现。这个示例是泛型方法,返回三个Comparable对象中的最大对象-publicclassMaximumTest{//确定三个Comparable对象中最大的一个publics......
  • Java定义变量容易出错的点
    在Java中,定义的数值有默认的类型(整型为int、浮点型为double),所以在定义变量的时候要注意类型的问题。例如:因为给l的值(10000000000)默认类型是int类型,所以超出了范围;修改:在给的值后面加上L,......
  • Java基础2
    1.抽象类在Java中,抽象类(AbstractClass)是一种特殊类型的类,它不能被实例化,而是用于被其他类继承。抽象类可以包含抽象方法和具体方法。以下是关于抽象类的一些关键点:定义抽象类:使用abstract关键字定义抽象类。不能实例化抽象类,即不能使用new关键字创建抽象类的......
  • 无涯教程-Java泛型 - 原始类型
    如果原始类型的类型参数在创建过程中未传递,则原始类型是通用类或接口的对象。以下示例将展示上述概念。packagecom.learnfk;publicclassGenericsTester{publicstaticvoidmain(String[]args){Box<Integer>box=newBox<Integer>();box.set......