我想再学一次Java三种循环结构哦---【开发实例】

简介: 我想再学一次Java三种循环结构哦---【开发实例】

作为一名对技术充满热情的学习者,我一直以来都深刻地体会到知识的广度和深度。在这个不断演变的数字时代,我远非专家,而是一位不断追求进步的旅行者。通过这篇博客,我想分享我在某个领域的学习经验,与大家共同探讨、共同成长。请大家以开放的心态阅读,相信你们也会在这段知识之旅中找到启示。



前言

在Java的编程中,我们经常使用循环结构来是代码更加简洁,重用性变得更强,今天我们就在聊一聊Java中的三种循环结构,当然不论学习那种编程语言,我们都会不断地接触它们.这也是我们学习地重点,那我们一起往下看吧:


一、循环结构:

Java中常用的三种循环结构分别是for循环while循环do-while循环。它们各自有不同的用法和特点.

1.for循环:

for循环是最常用的循环结构之一,它特别适合在你知道需要执行循环的确切次数时使用。for循环包含三个部分:初始化语句、条件表达式和迭代表达式,它们通常用分号隔开。

结构如下:

for (初始化语句; 条件表达式; 迭代表达式) {
       // 循环体
   }

例如:

for (int i = 0; i < 10; i++) {
       System.out.println("i = " + i);
   }
   //上述代码会打印从0到9的数字。

2.while循环:

while循环比for循环更简单,当条件为true时,循环会一直执行。它适用于你不知道需要执行多少次循环,只知道循环需要继续进行直到某个条件不满足时。

结构如下:

while (条件表达式) {
       // 循环体
   }

例如:

int i = 0;
   while (i < 10) {
       System.out.println("i = " + i);
       i++;
       //上述代码会打印从0到9的数字。
   }
注意,如果条件初始值为false,则循环体内的代码块不会执行。

3.do-while循环:

do-while循环类似于while循环,但它至少会执行一次循环体,因为条件表达式是在循环体执行后才进行评估的。这意味着循环体内的代码至少执行一次,即使条件一开始就是false。

结构如下:

do {
       // 循环体
   } while (条件表达式);

例如:

int i = 0;
   do {
       System.out.println("i = " + i);
       i++;
   } while (i < 10);
   //上述代码也会打印从0到9的数字。
不过,即使i初始化值大于或等于10,循环体也会至少执行一次。
  • 在选择使用哪种循环时,你应该基于你的特定需求和条件来决定。for循环在迭代次数固定时非常有用,while和do-while循环在不确定迭代次数但需要根据特定条件持续运行的场景下更为适用。

二.for循环的构造:

在Java的for循环中,初始化语句、条件表达式和迭代表达式扮演着循环控制的关键角色:

  • **初始化语句(Initialization Statement):**在循环开始之前,初始化语句先被执行。通常,这部分用来声明循环变量并进行初始化。它设置了循环的起始点。初始化语句只会在循环开始时执行一次。
    举例:
int i = 0;

这里定义了一个起始点i为0。初始化语句也可以用来定义多个变量,比如:

for (int i = 0, j = 10; ...; ...) {
       // 循环体
   }
  • 条件表达式(Conditional Expression)
    条件表达式在每次循环迭代开始之前评估。这个表达式必须返回一个布尔值。它决定了循环是否继续。如果条件表达式的结果是true,循环体就会执行;如果条件表达式的结果是false,循环就会终止。
    举例:
i < 10

这里的条件是循环将继续直到i小于10。每次循环迭代之前都会检查这个条件。

  • 迭代表达式(Iteration Expression):在每次循环体执行之后,迭代表达式都会被执行。迭代表达式通常用来更新循环变量,可能是增加或减少其值。这是维持循环继续或终止的一个重要因素。
    举例:
i++

这里的迭代表达式是将循环变量i的值增加1。你也可以使用更复杂的表达式或更新多个变量,如:

for (...; ...; i++, j--) {
       // 循环体
   }

将这三个部分合在一起,for循环的完整形式是:

for (int i = 0; i < 10; i++) {
    // 循环体:这段代码会重复执行直到i不小于10
    System.out.println("i = " + i);
}

在上面的示例中,循环开始前,i被初始化为0。然后在每次循环开始前,会检查i < 10这个条件,只要条件满足,就会执行循环体内的代码。最后,在每次循环体执行结束后,i的值会通过i++增加1。当i达到10时,条件i < 10就不再满足,循环终止。

三.如何区别while和do-while循环:

while循环和do-while循环在Java中都提供了根据条件重复执行代码块的方法,不过它们在逻辑上有一个关键的不同:

  • while循环:在每次循环执行之前,先评估条件。如果条件为true,循环体会被执行。如果条件为false,循环会被跳过,且循环体一次也不会执行。
while (condition) {
    // 循环体
}
  • do-while循环:先执行循环体,然后评估条件。无论条件最初是否为true,循环体至少执行一次。只有在循环体执行后,如果条件为false,循环才会停止。
do {
    // 循环体
} while (condition);

底层执行流程的角度来看,二者的差异在于循环条件检查的时机。

在while循环中,程序控制会先移至条件表达式的计算,如果计算结果为true,则进入循环体执行相应的代码。每次执行循环体后,都会重新评估条件表达式。这意味着,如果条件表达式的初始计算结果为false,循环体就不会被执行。

  • 在do-while循环中,程序控制首先执行循环体中的代码,之后才去计算条件表达式的值。在首次执行循环体后,如果条件为true,程序会再次执行循环体。循环将继续重复,直至条件表达式为false。

在编程底层,循环这两种结构的差异主要体现在跳转指令上。while循环先进行条件检查,如果条件不成立,程序将跳出循环;而do-while循环在每次循环结束后进行条件检查,至少保证循环体执行一次。在实际的机器代码或字节码层面,这些跳转会通过不同的分支指令来实现,而且do-whileloops 通常会包含一个在循环结束后跳回循环开始之前的位置的跳转指令,以便进行条件判断。

三种循环结构的重要性:

在Java中,循环结构在编程中极其重要,因为它们允许我们执行重复的操作,而不需要编写相同的代码多次。以下是三种循环结构的重要性:

1.代码重用和简洁性:循环允许我们将重复的任务集中到一个代码块中,这意味着更简洁、更易于维护的代码,也减少了出错的机会。

2.处理集合和数组:Java中的集合和数组通常通过循环遍历来处理其中的元素。for循环特别适用于这种情况,因为它可以与集合的大小结合,直观地遍历整个集合。

3.性能:通过精确地控制循环的次数和条件,我们可以提高程序的执行效率。在需求明确的情况下,选择正确的循环结构可以减小性能开销。

4.控制流程:循环提供了控制程序运行方式的能力。在满足特定条件时,我们可以使程序执行重复任务,或者持续执行直到达到某个状态。

5.灵活性:while和do-while循环提供了更大的灵活性,因为它们允许代码在条件变成false之前不确定的次数内执行。这在处理用户输入和实时数据更新时尤其有用。

6.可读性和组织性:for循环在循环头部集中了初始化、条件检查和迭代步骤,这使得代码更容易阅读和理解。而while和do-while循环则在循环结构不够清晰或需要在循环执行至少一次的情况下使用。

7.有条件的执行:循环使得程序能够基于条件判断选择是否执行特定代码块,这对于构建交互式应用程序和响应外部事件特别重要。

每种循环结构都有其特定的使用场景,选择合适的循环结构可以帮助开发者写出更高效、更可读的代码。例如,for循环在迭代次数已知的情况下是首选,而while循环在条件是在循环内部改变时可能更加适用。do-while循环则适合至少需要执行一次循环体的情况。

四.实际开发实例:

1.for循环:

在实际开发中,for循环通常用于处理固定数量的迭代,例如处理数组或集合中的每个元素。这里有一个for循环的开发实例,它涉及到批量处理数据库中的记录。

实例:在一个数据库表中有成千上万条客户记录。我们需要遍历这些记录,然后对每个客户的数据执行一些数据清洗操作,并更新回数据库。

import java.util.List;
import java.sql.*;
// 假设Customer是一个存储客户信息的类
public class CustomerDataProcessor {
    public void cleanAndUpdateTimeZoneForCustomers() {
        Connection dbConnection = null;
        PreparedStatement selectStmt = null;
        PreparedStatement updateStmt = null;
        ResultSet rs = null;
        String selectQuery = "SELECT id, name, email, timezone FROM customers";
        String updateQuery = "UPDATE customers SET timezone = ? WHERE id = ?";
        
        try {
            // 初始化数据库连接并准备语句
            dbConnection = getDatabaseConnection();
            selectStmt = dbConnection.prepareStatement(selectQuery);
            updateStmt = dbConnection.prepareStatement(updateQuery);
            // 执行查询
            rs = selectStmt.executeQuery();
            // 使用for循环遍历记录
            while (rs.next()) {
                long customerId = rs.getLong("id");
                String customerName = rs.getString("name");
                String customerEmail = rs.getString("email");
                String customerTimezone = rs.getString("timezone");
                // 清洗数据:此处可以加入具体逻辑,例如调用一个外部API校正时区
                String cleanedTimezone = cleanTimeZone(customerTimezone);
                // 更新数据库记录
                updateStmt.setString(1, cleanedTimezone);
                updateStmt.setLong(2, customerId);
                updateStmt.executeUpdate();
            }
        } catch (SQLException e) {
            // 异常处理逻辑
            e.printStackTrace();
        } finally {
            // 关闭资源
            close(dbConnection, selectStmt, updateStmt, rs);
        }
    }
    private String cleanTimeZone(String timezone) {
        // 假设cleanTimeZone实现对时区的清洗逻辑
        // 比如修正非法的时区字符串或校验时区数据
        return timezone; // 这里返回处理过的时区字符串
    }
    // 下面将是获取数据库连接和关闭资源的方法...
}

在这里,我们使用了while循环而不是for循环。这是因为当我们从数据库中读取记录时,通常更倾向于使用while (rs.next())结构,这是由于我们在开始循环之前并不知道具体的记录数。然而,如果我们有一个明确数量的数组或集合,我们也可以用for循环来进行类似的操作:

List<Customer> customers = getCustomersFromDatabase();
for (Customer customer : customers) {
    // 对每一个客户的数据进行处理
    processCustomerData(customer);
}

在这个假设的例子里,getCustomersFromDatabase()方法返回了一个已知大小的Customer对象列表,并且我们使用for-each循环来遍历此列表,并对每个客户对象进行处理。

for循环在这种情况下显得更加简洁明了,尤其是当处理的是集合类数据结构(如数组、列表等)时。

2.while循环:

假设我们正在编写一个网络服务客户端,在网络不稳定时,我们可能希望对失败的请求进行一定次数的重试。在这种情况下,我们通常不知道需要重试多少次才能成功,但是我们会设定一个最大的重试次数,并且在每次重试之间可能还会加上延迟,以避免请求过于频繁导致服务器压力过大。

while循环适用的例子:

public boolean fetchDataFromServerWithRetry(String requestUrl, int maxAttempts, long retryDelay) {
    int attempt = 1;
    boolean isSuccess = false;
    // 当尝试次数少于最大尝试次数,并且请求没有成功时继续循环
    while (attempt <= maxAttempts && !isSuccess) {
        try {
            // 发送网络请求(假设sendHttpRequest是已经实现的方法)
            isSuccess = sendHttpRequest(requestUrl);
            if (isSuccess) {
                // 请求成功,打印消息并退出循环
                System.out.println("Request succeeded after " + attempt + " attempts.");
            }
        } catch (Exception e) {
            // 出现异常,打印错误日志
            System.err.println("Attempt " + attempt + " failed: " + e.getMessage());
        }
        // 如果尚未成功,则在下一次尝试前增加延时
        if (!isSuccess) {
            try {
                Thread.sleep(retryDelay);
            } catch (InterruptedException ie) {
                Thread.currentThread().interrupt(); // 重新中断状态
                return false; // 中断情况下退出
            }
            attempt++;
        }
    }
    return isSuccess;
}

在这个例子中,我们while循环

3.do-while循环:

实现一个简单的命令行菜单,允许用户选择不同的选项来执行不同的任务。在用户完成一个任务后,程序将再次显示菜单,除非用户选择退出。

import java.util.Scanner;
public class CommandMenuExample {
    // 显示菜单并获取用户输入
    public static int getMenuOption(Scanner scanner) {
        System.out.println("\nPlease choose an option:");
        System.out.println("1. Task A");
        System.out.println("2. Task B");
        System.out.println("3. Task C");
        System.out.println("4. Exit");
        return scanner.nextInt();
    }
    public static void executeTask(int option) {
        switch (option) {
            case 1:
                System.out.println("Performing Task A...");
                // 任务A的代码逻辑
                break;
            case 2:
                System.out.println("Performing Task B...");
                // 任务B的代码逻辑
                break;
            case 3:
                System.out.println("Performing Task C...");
                // 任务C的代码逻辑
                break;
            case 4:
                System.out.println("Exiting...");
                break;
            default:
                System.out.println("Invalid option. Please try again.");
                break;
        }
    }
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int option;
        do {
            option = getMenuOption(scanner);
            executeTask(option);
        } while (option != 4);
        scanner.close();
    }
}

在这个例子中,我们使用一个do-while循环来保证菜单至少被显示一次。即使用户一开始就选择退出(选项4),程序也会先展示一次菜单再结束。每次循环体内,程序执行根据用户选择的选项对应的任务,然后重新显示菜单。只有当用户选择退出选项时,循环才会停止。

这种对do-while循环的使用是相当自然的,因为我们总是希望至少显示一次菜单并允许用户进行一次选择,并在此之后基于用户的输入决定是否继续显示菜单。

总结

通过详细的介绍这三种结构,希望同学们有新的认识,在任何一种语言的学习中,三种循环结构可以解决任何与循环有关的问题,我们在面对不同场景下,要选择适当的循环语句,当然,结合使用是在开发中必不可少的.

感谢各位同学阅读完博主的文章,希望大家为博主点点关注,我会持续更新,希望和大家一起讨论,共同进步,最后,祝大家在未来的学习和工作中可以一帆风顺,加油!!!

目录
相关文章
|
24天前
|
监控 JavaScript 前端开发
《理解 WebSocket:Java Web 开发的实时通信技术》
【4月更文挑战第4天】WebSocket是Java Web实时通信的关键技术,提供双向持久连接,实现低延迟、高效率的实时交互。适用于聊天应用、在线游戏、数据监控和即时通知。开发涉及服务器端实现、客户端连接及数据协议定义,注意安全、错误处理、性能和兼容性。随着实时应用需求增加,WebSocket在Java Web开发中的地位将更加重要。
|
1天前
|
Java
【专栏】Java中的反射机制与应用实例
【4月更文挑战第27天】本文探讨了Java反射机制,该机制允许程序在运行时获取类信息、动态创建对象、调用方法和访问属性。反射通过Class、Constructor、Method和Field类实现。文中列举了反射的应用场景,如动态创建对象、调用方法、访问属性和处理注解,并提供了相关实例代码演示。
|
4天前
|
设计模式 存储 前端开发
Java从入门到精通:2.2.1学习Java Web开发,了解Servlet和JSP技术,掌握MVC设计模式
Java从入门到精通:2.2.1学习Java Web开发,了解Servlet和JSP技术,掌握MVC设计模式
|
9天前
|
IDE Java 数据库连接
使用 Java 进行桌面应用开发
【4月更文挑战第19天】Java 是一款广泛应用于企业级、网络和桌面应用开发的编程语言。其跨平台特性使Java程序能在不同操作系统上运行,而JDK提供了开发所需工具和库。使用Swing等GUI库构建用户界面,结合JDBC进行数据库操作,Socket实现网络通信。虽然面临性能和用户体验的挑战,但通过优化和选用合适的IDE,Java仍能开发出高效稳定的桌面应用。
|
10天前
|
前端开发 Java Go
开发语言详解(python、java、Go(Golong)。。。。)
开发语言详解(python、java、Go(Golong)。。。。)
|
10天前
|
人工智能 前端开发 Java
Java语言开发的AI智慧导诊系统源码springboot+redis 3D互联网智导诊系统源码
智慧导诊解决盲目就诊问题,减轻分诊工作压力。降低挂错号比例,优化就诊流程,有效提高线上线下医疗机构接诊效率。可通过人体画像选择症状部位,了解对应病症信息和推荐就医科室。
151 10
|
10天前
|
Java 关系型数据库 MySQL
一套java+ spring boot与vue+ mysql技术开发的UWB高精度工厂人员定位全套系统源码有应用案例
UWB (ULTRA WIDE BAND, UWB) 技术是一种无线载波通讯技术,它不采用正弦载波,而是利用纳秒级的非正弦波窄脉冲传输数据,因此其所占的频谱范围很宽。一套UWB精确定位系统,最高定位精度可达10cm,具有高精度,高动态,高容量,低功耗的应用。
一套java+ spring boot与vue+ mysql技术开发的UWB高精度工厂人员定位全套系统源码有应用案例
|
16天前
|
Java Shell
Java 21颠覆传统:未命名类与实例Main方法的编码变革
Java 21颠覆传统:未命名类与实例Main方法的编码变革
14 0
|
17天前
|
运维 NoSQL 算法
Java开发-深入理解Redis Cluster的工作原理
综上所述,Redis Cluster通过数据分片、节点发现、主从复制、数据迁移、故障检测和客户端路由等机制,实现了一个分布式的、高可用的Redis解决方案。它允许数据分布在多个节点上,提供了自动故障转移和读写分离的功能,适用于需要大规模、高性能、高可用性的应用场景。
16 0
|
19天前
|
人工智能 小程序 Java
JAVA开发智慧学校系统源码+人脸电子班牌布局
智慧校园是通过利用物联网,大数据技术来改变师生和校园资源相互交互的方式,以便提高交互的明确性、灵活性和响应速度,从而实现智慧化服务和管理的校园模式。