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

2024-01-26 19:20

本文主要是介绍我想再学一次Java三种循环结构哦---【开发实例】,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在这里插入图片描述

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

文章目录

  • 前言
  • 一、循环结构:
    • 1.for循环:
    • 2.while循环:
    • 3.do-while循环:
  • 二.for循环的构造:
  • 三.如何区别while和do-while循环:
  • 三种循环结构的重要性:
  • 四.实际开发实例:
  • 总结


前言

在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不小于10System.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循环的使用是相当自然的,因为我们总是希望至少显示一次菜单并允许用户进行一次选择,并在此之后基于用户的输入决定是否继续显示菜单。

总结

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

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

这篇关于我想再学一次Java三种循环结构哦---【开发实例】的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/647811

相关文章

JVM 的类初始化机制

前言 当你在 Java 程序中new对象时,有没有考虑过 JVM 是如何把静态的字节码(byte code)转化为运行时对象的呢,这个问题看似简单,但清楚的同学相信也不会太多,这篇文章首先介绍 JVM 类初始化的机制,然后给出几个易出错的实例来分析,帮助大家更好理解这个知识点。 JVM 将字节码转化为运行时对象分为三个阶段,分别是:loading 、Linking、initialization

Spring Security 基于表达式的权限控制

前言 spring security 3.0已经可以使用spring el表达式来控制授权,允许在表达式中使用复杂的布尔逻辑来控制访问的权限。 常见的表达式 Spring Security可用表达式对象的基类是SecurityExpressionRoot。 表达式描述hasRole([role])用户拥有制定的角色时返回true (Spring security默认会带有ROLE_前缀),去

浅析Spring Security认证过程

类图 为了方便理解Spring Security认证流程,特意画了如下的类图,包含相关的核心认证类 概述 核心验证器 AuthenticationManager 该对象提供了认证方法的入口,接收一个Authentiaton对象作为参数; public interface AuthenticationManager {Authentication authenticate(Authenti

Spring Security--Architecture Overview

1 核心组件 这一节主要介绍一些在Spring Security中常见且核心的Java类,它们之间的依赖,构建起了整个框架。想要理解整个架构,最起码得对这些类眼熟。 1.1 SecurityContextHolder SecurityContextHolder用于存储安全上下文(security context)的信息。当前操作的用户是谁,该用户是否已经被认证,他拥有哪些角色权限…这些都被保

Spring Security基于数据库验证流程详解

Spring Security 校验流程图 相关解释说明(认真看哦) AbstractAuthenticationProcessingFilter 抽象类 /*** 调用 #requiresAuthentication(HttpServletRequest, HttpServletResponse) 决定是否需要进行验证操作。* 如果需要验证,则会调用 #attemptAuthentica

Spring Security 从入门到进阶系列教程

Spring Security 入门系列 《保护 Web 应用的安全》 《Spring-Security-入门(一):登录与退出》 《Spring-Security-入门(二):基于数据库验证》 《Spring-Security-入门(三):密码加密》 《Spring-Security-入门(四):自定义-Filter》 《Spring-Security-入门(五):在 Sprin

Java架构师知识体认识

源码分析 常用设计模式 Proxy代理模式Factory工厂模式Singleton单例模式Delegate委派模式Strategy策略模式Prototype原型模式Template模板模式 Spring5 beans 接口实例化代理Bean操作 Context Ioc容器设计原理及高级特性Aop设计原理Factorybean与Beanfactory Transaction 声明式事物

这15个Vue指令,让你的项目开发爽到爆

1. V-Hotkey 仓库地址: github.com/Dafrok/v-ho… Demo: 戳这里 https://dafrok.github.io/v-hotkey 安装: npm install --save v-hotkey 这个指令可以给组件绑定一个或多个快捷键。你想要通过按下 Escape 键后隐藏某个组件,按住 Control 和回车键再显示它吗?小菜一碟: <template

Hadoop企业开发案例调优场景

需求 (1)需求:从1G数据中,统计每个单词出现次数。服务器3台,每台配置4G内存,4核CPU,4线程。 (2)需求分析: 1G / 128m = 8个MapTask;1个ReduceTask;1个mrAppMaster 平均每个节点运行10个 / 3台 ≈ 3个任务(4    3    3) HDFS参数调优 (1)修改:hadoop-env.sh export HDFS_NAMENOD

Java进阶13讲__第12讲_1/2

多线程、线程池 1.  线程概念 1.1  什么是线程 1.2  线程的好处 2.   创建线程的三种方式 注意事项 2.1  继承Thread类 2.1.1 认识  2.1.2  编码实现  package cn.hdc.oop10.Thread;import org.slf4j.Logger;import org.slf4j.LoggerFactory