Java程序设计的基本结构 - 循环结构

简介: Java程序设计的基本结构 - 循环结构

一、循环的基本结构

为了讲解方便,我们可以将循环结构划分为四个部分来进行描述。当然,这四个部分并不是都要出现,甚至在都不出现时也可以构成一个循环结构。并且,对于不同的循环结构,每个部分的相对位置也不同。

1. 初始化部分

在进入循环结构之前可以定义一些循环中以及循环结束后都要用到的变量,进行赋值。

2. 判断条件部分

用于决定是否继续进行循环,如果为假,则循环结束。判断部分可以直接使用一个布尔类型的变量,或者使用表达式,但是必须保证表达式的结果为布尔类型。

3. 循环体部分

循环结构的核心部分,用于书写每次想要重复执行的代码,通常要根据程序功能来设计。

4. 迭代部分

用于辅助控制循环的结束,在循环体之后执行,如变量自增等。

与判断结构类似,当不使用大括号时,循环结构只能控制一行代码,通常我们会添加大括号

二、while循环

1. 循环结构

[初始化部分]
while(条件判断部分){
    循环体
    [迭代部分]
}

2. 循环特点

对于while循环,通常用于循环次数不确定时,如:让使用者决定什么时候退出循环。

  • 可以用一个布尔变量直接来决定循环是否继续
  • 可以用break关键字随时跳出循环
  • 当条件判断部分不成立时结束循环
  • 初始化部分和迭代部分可以省略
  • 条件判断部分后如果出现分号会导致结构直接结束

3. 示例程序

  • 循环输出1到9
public static void main(String[] args){
    // 初始化部分
    int i = 1;
    // 括号中为循环继续执行的条件:当i的值小于等于9时
    while(i <= 9){
        // 循环体部分
        System.out.println(i);
        // 迭代部分:辅助控制循环结束或根据循环体的需要来写
        i++;
    }
}
  • 猜字程序
import java.util.Scanner;
import java.util.Random;
public class Test{
    public static void main(String[] args){
        // 初始化Scanner,用于从键盘读入数据
        Scanner sc = new Scanner(System.in);
        // 初始化随机数生成工具
        Random random = new Random();
        // 随机生成一个0~99的整数
        int n = random.nextInt(100);
        // 定义一个布尔类型的变量,用于控制循环的结束
        boolean flag = true; 
        // 使用flag作为控制循环结束的变量       
        while(flag){
            System.out.println("请输入一个数:");
            // 从键盘读取一个数
            int temp = sc.nextInt();
            // 判断输入的数是否与随机数相同,猜中则退出
            if(temp == n){
                System.out.println("猜中了!");
                // 修改flag为false,使得循环退出        
                flag = false;
            }else{
                // 如果没有猜中,就让用户自己决定是不是要继续猜
                System.out.println("猜错了!还要继续吗?1:继续2:退出");
                // 如果输入的数字为2则退出(此处暂不考虑输入出错等其他情况)
                if(sc.nextInt() == 2){
                    // 修改flag为false,使得循环退出        
                    flag = false;
                }
            }
        }
        // 使用后关闭
        sc.close();
    }
}

三、do-while循环

1. 循环结构

[初始化部分]
do{
    循环体
    [迭代部分]
}while(条件判断部分);

2. 循环特点

do-while循环与while循环的用法基本相同,主要的不同点在于循环体(迭代部分)一定会先执行一次,然后再进行判断,这非常适合在初学时做成菜单程序。

  • 可以用一个布尔变量直接来决定循环是否继续
  • 可以用break关键字随时跳出循环
  • 当条件判断部分不成立时结束循环
  • 初始化部分和迭代部分可以省略

3. 示例程序

  • 菜单程序

break只能跳出离自己最近一层的switch-case或循环结构,如果想直接跳出指定层的循环,需要使用到自定义标签。自定义标签的用法比较简单,直接在一个循环结构的起始位置加一个单词,配合冒号使用,在进行跳出时,可以在break后面添加自定义标签的名称,即可跳出指定层的循环。

import java.util.Scanner;
public class Test{
    public static void main(String[] args){
        // 初始化Scanner,用于从键盘读入数据
        Scanner sc = new Scanner(System.in);
        // 在此处使用自定义标签out(名称可以自定义)来进行标记
        out:do{
            System.out.println("****欢迎使用xxx系统****");
            System.out.println("****1.系统功能一*******");
            System.out.println("****2.系统功能二*******");
            System.out.println("****3.退出系统*********");
            System.out.print("请输入功能选项:");
            // 从键盘读入一个数选择要执行的功能
            int select = sc.nextInt();
            switch(select){
                case 1:
                    // 功能一相关代码
                    break;
                case 2:
                    // 功能二相关代码
                    break;
                case 3:
                    // 指定跳出外层的do-while循环,否则只能跳出当前的switch-case结构
                    break out;
            }
        // 判断条件一直为真,除非用户输入选项3退出系统,则使用break跳出。
        }while(true);
        // 使用后关闭
        sc.close();
    }
}

四、for循环

1. 循环结构

for(初始化部分;条件判断部分;迭代部分){
    循环体
}

2. 循环特点

for循环主要用于循环次数确定的情况,通常使用break直接跳出循环是由于已经完成了所需工作,终止剩余无用循环以提高程序运行效率。

  • for循环的一个明显特点在于初始化部分,迭代部分的控制比较方便,可以完全在循环内部完成
  • 初始化部分写在小括号中第一个位置,只会执行一次
  • 如果在初始化部分声明一个新的变量,则该变量只能在循环内部使用
  • 判断条件出现在小括号的中间位置,可以是布尔类型的变量或表达式,也可以直接省略使用break关键字手动跳出
  • 迭代部分通常用于变量的控制,每次循环体结束后执行
  • continue关键字可以用于所有的循环结构,作用是立即结束当前循环(跳过循环体的剩余部分内容,迭代部分依然会执行),进入下一次循环

3. 示例程序

  • 计算整数1~10的加和
public static void main(String[] args){
    // 定义一个整数类型变量,用于记录结果
    int sum = 0;
    for(int i = 1;i <= 10;i++){
        // 根据逻辑,将每次得到的值相加
        sum += i;
    }
    // 输出计算结果
    System.out.println(sum);
}
  • 输出整数0~100范围内的所有偶数
public static void main(String[] args){
    for(int i = 0;i <= 100;i++){
        // 判断当前数字的奇偶性,如果是奇数则跳过输出语句
        if(i % 2 != 0){
            // 如果是奇数,将跳过循环体剩余的部分,迭代部分不受影响
            continue;
        }
        System.out.println(i);
    }
    // 输出计算结果
    System.out.println(sum);
}

五、死循环

死循环的出现是由于我们没有正确的指定循环的终止条件和控制相关的变量,导致判断条件部分一直为真,使得循环结构无法结束。但有些时候根据功能需要我们会手动先构造一个死循环,然后使用break来进行跳出,如:菜单程序,由用户来决定什么时候结束,进行循环的跳出。手动构建一个死循环十分简单,但是如果意外的出现死循环就需要优先检查条件判断部分以及相关变量的变化了。

1. while循环

while(true){
    循环体
}

2. do-while循环

do{
    循环体
}while(true)

3. for循环

// 是的,你没有看错,所有的部分都不需要填写,但是分号不能省略
for(;;){
    循环体
}


目录
相关文章
|
15天前
|
传感器 安全 Java
《从头开始学java,一天一个知识点》之:循环结构:for与while循环的使用场景
**你是否也经历过这些崩溃瞬间?** - 看了三天教程,连`i++`和`++i`的区别都说不清 - 面试时被追问&quot;`a==b`和`equals()`的区别&quot;,大脑突然空白
64 22
|
11天前
|
前端开发 Cloud Native Java
Java||Springboot读取本地目录的文件和文件结构,读取服务器文档目录数据供前端渲染的API实现
博客不应该只有代码和解决方案,重点应该在于给出解决方案的同时分享思维模式,只有思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
Java||Springboot读取本地目录的文件和文件结构,读取服务器文档目录数据供前端渲染的API实现
|
21天前
|
传感器 监控 Java
Java代码结构解析:类、方法、主函数(1分钟解剖室)
### Java代码结构简介 掌握Java代码结构如同拥有程序世界的建筑蓝图,类、方法和主函数构成“黄金三角”。类是独立的容器,承载成员变量和方法;方法实现特定功能,参数控制输入环境;主函数是程序入口。常见错误包括类名与文件名不匹配、忘记static修饰符和花括号未闭合。通过实战案例学习电商系统、游戏角色控制和物联网设备监控,理解类的作用、方法类型和主函数任务,避免典型错误,逐步提升编程能力。 **脑图速记法**:类如太空站,方法即舱段;main是发射台,static不能换;文件名对仗,括号要成双;参数是坐标,void不返航。
45 5
|
5月前
|
Java 测试技术 开发者
💡Java 零基础:彻底掌握 for 循环,打造高效程序设计
【10月更文挑战第15天】本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
169 63
|
4月前
|
JSON Java 程序员
Java|如何用一个统一结构接收成员名称不固定的数据
本文介绍了一种 Java 中如何用一个统一结构接收成员名称不固定的数据的方法。
65 3
|
5月前
|
存储 算法 Java
🚀Java零基础-顺序结构详解 🚀
【10月更文挑战第11天】本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
66 6
|
5月前
|
小程序 Oracle Java
JVM知识体系学习一:JVM了解基础、java编译后class文件的类结构详解,class分析工具 javap 和 jclasslib 的使用
这篇文章是关于JVM基础知识的介绍,包括JVM的跨平台和跨语言特性、Class文件格式的详细解析,以及如何使用javap和jclasslib工具来分析Class文件。
105 0
JVM知识体系学习一:JVM了解基础、java编译后class文件的类结构详解,class分析工具 javap 和 jclasslib 的使用
|
1月前
|
存储 监控 Java
【Java并发】【线程池】带你从0-1入门线程池
欢迎来到我的技术博客!我是一名热爱编程的开发者,梦想是编写高端CRUD应用。2025年我正在沉淀中,博客更新速度加快,期待与你一起成长。 线程池是一种复用线程资源的机制,通过预先创建一定数量的线程并管理其生命周期,避免频繁创建/销毁线程带来的性能开销。它解决了线程创建成本高、资源耗尽风险、响应速度慢和任务执行缺乏管理等问题。
162 60
【Java并发】【线程池】带你从0-1入门线程池
|
17天前
|
存储 网络协议 安全
Java网络编程,多线程,IO流综合小项目一一ChatBoxes
**项目介绍**:本项目实现了一个基于TCP协议的C/S架构控制台聊天室,支持局域网内多客户端同时聊天。用户需注册并登录,用户名唯一,密码格式为字母开头加纯数字。登录后可实时聊天,服务端负责验证用户信息并转发消息。 **项目亮点**: - **C/S架构**:客户端与服务端通过TCP连接通信。 - **多线程**:采用多线程处理多个客户端的并发请求,确保实时交互。 - **IO流**:使用BufferedReader和BufferedWriter进行数据传输,确保高效稳定的通信。 - **线程安全**:通过同步代码块和锁机制保证共享数据的安全性。
67 23
|
24天前
|
Java 调度
【源码】【Java并发】【线程池】邀请您从0-1阅读ThreadPoolExecutor源码
当我们创建一个`ThreadPoolExecutor`的时候,你是否会好奇🤔,它到底发生了什么?比如:我传的拒绝策略、线程工厂是啥时候被使用的? 核心线程数是个啥?最大线程数和它又有什么关系?线程池,它是怎么调度,我们传入的线程?...不要着急,小手手点上关注、点赞、收藏。主播马上从源码的角度带你们探索神秘线程池的世界...
94 0
【源码】【Java并发】【线程池】邀请您从0-1阅读ThreadPoolExecutor源码