就像有感知的生物一样,程序必须在执行过程中控制它的世界,并做出选择。在Java中,你要使用执行控制语句来作出选择。


一、流程控制基础概念

1.1 流程控制的重要性

        流程控制结构决定了程序执行的顺序和逻辑分支,是编程语言中最基础也是最重要的组成部分。Java继承了C/C++的大多数流程控制结构,但去除了一些容易出错的部分(如goto语句),并增加了一些安全性检查。

1.2 Java中的流程控制分类

        Java中的流程控制主要分为三类:

  1. 条件语句:if-else, switch-case

  2. 循环语句:while, do-while, for, 增强for循环

  3. 流程中断语句:break, continue, return


二、条件语句

2.1 if-else语句

        if-else是最基础的条件分支结构,语法如下:

if (布尔表达式) {// 表达式为true时执行
} else {// 表达式为false时执行
}
2.1.1 多条件分支

        可以嵌套使用if-else实现多条件分支:

if (condition1) {// condition1为true时执行
} else if (condition2) {// condition2为true时执行
} else {// 其他情况执行
}
2.1.2 注意事项
  • 布尔表达式必须返回boolean类型(与C/C++不同,不能使用数值)

  • 即使只有一条语句,也建议使用花括号(提高可读性和避免错误)

  • else与最近的if匹配

2.2 switch语句

        switch用于多值选择,语法如下:        

switch (表达式) {case 值1:// 代码块1break;case 值2:// 代码块2break;default:// 默认代码块
}
2.2.1 switch特性
  • 表达式类型可以是:

    • 基本类型:byte, short, char, int

    • 包装类:Byte, Short, Character, Integer

    • 枚举类型

    • String(Java 7+)

  • case值必须是编译时常量

  • 需要break语句防止"贯穿"(fall-through)现象

  • default分支是可选的

2.2.2 Java 12+的switch表达式

        Java 12引入了更简洁的switch表达式语法:

int numLetters = switch (day) {case MON, FRI, SUN -> 6;case TUE -> 7;case THU, SAT -> 8;case WED -> 9;default -> throw new IllegalStateException();
};

三、循环语句

3.1 while循环

        while循环在条件为真时重复执行代码块:

while (布尔表达式) {// 循环体
}
3.1.1 注意事项
  • 循环体可能一次都不执行(先检查条件)

  • 需要确保循环条件最终会变为false,否则会导致无限循环

  • 循环体内通常应修改影响循环条件的变量

3.2 do-while循环

        do-while循环先执行一次循环体,再检查条件:

do {// 循环体
} while (布尔表达式);
3.2.1 与while的区别
  • 循环体至少执行一次

  • 分号不能省略

3.3 for循环

        for循环提供了更紧凑的循环语法:

for (初始化; 布尔表达式; 步进) {// 循环体
}
3.3.1 for循环执行流程
  1. 执行初始化表达式(仅一次)

  2. 检查布尔表达式:

    • 如果为true,执行循环体

    • 如果为false,退出循环

  3. 执行步进表达式

  4. 重复步骤2-3

3.3.2 特殊形式
  • 可以省略初始化、布尔表达式或步进(但分号不能省略)

  • 可以在初始化部分声明多个变量(类型相同)

  • 可以在初始化部分使用已有变量

for (int i = 0, j = 10; i < j; i++, j--) {System.out.println(i + " " + j);
}

3.4 增强for循环(for-each)

        Java 5引入的增强for循环简化了数组和集合的遍历:

for (元素类型 变量名 : 数组或集合) {// 使用变量名访问元素
}
3.4.1 特点
  • 更简洁的语法

  • 避免使用显式索引

  • 不能修改原数组/集合元素(对于基本类型数组)

  • 不能获取当前索引

3.4.2 实现原理

        增强for循环对数组和Iterable接口的实现类处理方式不同:

  • 数组:编译为基于索引的标准for循环

  • Iterable:使用iterator()方法获取迭代器


四、流程中断语句

4.1 break

        break用于:

  1. 退出switch语句的case块

  2. 提前终止循环

4.1.1 带标签的break

        Java支持标签(label)语法,可以跳出多层嵌套循环:

outer:
for (int i = 0; i < 10; i++) {for (int j = 0; j < 10; j++) {if (i * j > 50) {break outer;  // 跳出外层循环}}
}

4.2 continue

        continue跳过当前循环的剩余部分,直接开始下一次循环:

for (int i = 0; i < 10; i++) {if (i % 2 == 0) {continue;  // 跳过偶数}System.out.println(i);
}
4.2.1 带标签的continue

        类似break,continue也可以使用标签:

outer:
for (int i = 0; i < 10; i++) {for (int j = 0; j < 10; j++) {if (j > i) {continue outer;  // 跳到外层循环的下一次迭代}System.out.println(i + " " + j);}
}

4.3 return

        return用于从方法中返回:

  1. 无返回值方法:直接返回

  2. 有返回值方法:返回指定值

public int max(int a, int b) {if (a > b) {return a;}return b;
}

五、特殊流程控制

5.1 嵌套循环

        循环可以多层嵌套,但应注意:

  • 嵌套层次不宜过深(通常不超过3层)

  • 内层循环应尽可能简单

  • 考虑使用带标签的break/continue简化控制

5.2 递归

        方法可以调用自身,形成递归:

public int factorial(int n) {if (n <= 1) {return 1;}return n * factorial(n - 1);
}
5.2.1 递归注意事项
  • 必须有终止条件

  • 每次递归应使问题规模减小

  • Java默认的调用栈深度有限(可通过-Xss参数调整)

  • 递归可能比迭代效率低


六、Java与C/C++流程控制的区别

  1. 布尔表达式:Java必须使用boolean类型,不能使用数值

  2. goto语句:Java没有goto,但标签+break/continue可以实现类似功能

  3. for循环变量作用域:Java可以在for初始化部分声明变量,作用域限于循环

  4. 增强for循环:Java特有的简化语法

  5. switch语句

    • Java 7+支持String

    • case值必须是编译时常量

    • 必须有break防止贯穿(除非有意为之)


七、最佳实践与常见陷阱

7.1 最佳实践

  1. 代码块始终使用花括号:即使只有一条语句

  2. switch语句始终包含default分支:处理未预期的值

  3. 避免深层嵌套:使用方法提取或提前返回简化逻辑

  4. 循环条件应明显可见:避免隐藏的无限循环

  5. 优先使用增强for循环:当不需要索引时

7.2 常见陷阱

  1. if语句缺少花括号

    if (condition)statement1;statement2;  // 无论condition如何都会执行
  2. switch贯穿问题

    switch (x) {case 1: System.out.println("1");case 2: System.out.println("2");  // 当x=1时也会执行
    }
  3. 浮点数比较

    for (double d = 0.1; d != 1.0; d += 0.1) {// 可能因浮点精度问题导致无限循环
    }
  4. 修改增强for循环的集合

    for (String s : list) {list.remove(s);  // 抛出ConcurrentModificationException
    }

八、现代Java中的流程控制改进

8.1 Java 14的switch表达式(正式版)

        Java 14使switch表达式成为正式特性:

int numLetters = switch (day) {case MON, FRI, SUN -> 6;case TUE -> 7;case THU, SAT -> 8;case WED -> {System.out.println("Wednesday");yield 9;  // 使用yield返回值}default -> 0;
};

8.2 模式匹配(预览特性)

        Java 14+引入了模式匹配的预览特性:

// instanceof模式匹配(Java 16正式)
if (obj instanceof String s) {System.out.println(s.length());  // 直接使用s
}// switch模式匹配(预览)
switch (obj) {case Integer i -> System.out.println("Integer: " + i);case String s -> System.out.println("String: " + s);default -> System.out.println("Other");
}

九、foreach设计哲学

9.1 设计目标

  1. 简化迭代语法:隐藏迭代器细节

  2. 统一访问方式:数组和集合使用相同语法

  3. 减少错误:避免越界和修改异常

9.2 foreach修改集合问题

List<String> list = new ArrayList<>();
// 错误方式(抛出ConcurrentModificationException)
for (String s : list) {if (s.equals("remove")) list.remove(s);
}// 正确方式1:使用迭代器
Iterator<String> it = list.iterator();
while (it.hasNext()) {if (it.next().equals("remove")) it.remove();
}// 正确方式2:Java 8+ removeIf
list.removeIf(s -> s.equals("remove"));

9.3 多维数组遍历优化

// 低效方式(多次数组访问)
for (int i = 0; i < matrix.length; i++) {for (int j = 0; j < matrix[i].length; j++) {sum += matrix[i][j];}
}// 高效方式(缓存行数组)
for (int[] row : matrix) {for (int val : row) {sum += val;}
}

结语:通过深入理解这些流程控制机制,我们可以编写出更高效、更健壮的Java代码,同时为适应Java语言的持续演进做好准备。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/92231.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/92231.shtml
英文地址,请注明出处:http://en.pswp.cn/web/92231.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

极验 G-star 人才特训营:为业务安全领域培养下一代新兴力量

本文导读 极验为什么要启动 G-star 实习生培养计划&#xff1f;50多位来自多所高校的同学&#xff0c;在极验经历了一场怎样的“非典型”实习&#xff1f;技术大咖亲授&#xff0c;先培训再实战&#xff0c;极验打造的是怎样的人才体系&#xff1f;同学有话说&#xff1a;培养计…

攻防世界-web-csaw-mfw

一.题目分析这边提示使用了Git&#xff0c;试着访问.git看是否存在.git泄露浏览了一下&#xff0c;很多都是乱码&#xff0c;想着用githack将git库克隆下看一下二.操作python2 GitHack.py http://url/.git访问了一下flag.php&#xff0c;没啥发现&#xff0c;在看一下index.php…

202506 电子学会青少年等级考试机器人四级实际操作真题

更多内容和历年真题请查看网站&#xff1a;【试卷中心 -----> 电子学会 ----> 机器人技术 ----> 四级】 网站链接 青少年软件编程历年真题模拟题实时更新 2025年6月 青少年等级考试机器人实操真题四级 实际操作 主题&#xff1a;感应节能灯&#xff08;四级&am…

DLT645电表数据 保存到MySQL数据库项目案例

目录 1 案例说明 2 VFBOX网关工作原理 3 准备工作 4 配置VFBOX网关采集DLT645电表数据 5 网关写数据到MYSQL数据库 6 安装MYSQL数据库 7 其他说明 8 案例总结 1 案例说明 设置网关采集DLT645电表数据数据把采集的数据保存到MySQL数据库。 2 VFBOX网关工作原理 VFBOX网关…

Redux与React - 异步状态操作(React快速上手4)

异步操作样板代码1. 创建store的写法保持不变&#xff0c;配置好同步修改状态的方法 2. 单独封装一个函数&#xff0c;在函数内部return一个新函数&#xff0c;在新函数中 2.1 封装异步请求获取数据 2.2 调用同步actionCreater传入异步数据生成一个action对象&#xff0c;并使用…

win10桌面右键没有新建word

win10右键新建word不见解决方法1、点击开始&#xff0c;找到运行命令行&#xff0c;输入regedit&#xff0c;打开注册表。2、在左侧找到HKEY_CLASSES_ROOT目录&#xff0c;并展开。3.找到.docx 双击&#xff08;默认&#xff09;一项&#xff0c;将其改为 Word.Document.12。关…

Docker国内可用镜像(2025.08.06测试)

Docker渡渡鸟镜像可用&#xff08;测试时间2025.08.06&#xff09;https://docker.aityp.com/使用渡渡鸟镜像pull ollama latest 例子&#xff1a;docker pull swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/ollama/ollama:0.10.1毫秒镜像和轩辕镜像也可用&#xff0c;但…

决策树的实际案例

决策树作为一种直观、易解释的机器学习算法&#xff0c;在金融、医疗、电商、风控等多个领域都有广泛的实际应用。以下将讲解1个典型案例&#xff1a;贷款违约预测。对于贷款违约预测&#xff0c;即在贷款人员在贷款之前对其进行预测&#xff0c;通过他的众多特征情况判别是否可…

bool 类型转换运算符重载

以下是一个极简且聚焦核心知识点的示例代码&#xff0c;用最直观的方式演示 bool 类型转换运算符重载的触发逻辑、使用场景和避坑点&#xff0c;帮你快速掌握&#xff1a;cpp运行#include <iostream> using namespace std;// 核心类&#xff1a;演示 bool 转换运算符 cla…

LVGL代码框架简介

LVGL代码框架介绍LVGL&#xff08;Light and Versatile Graphics Library&#xff09;是一个轻量级、功能强大的嵌入式图形库。其代码架构设计清晰&#xff0c;模块化程度高。1. 整体架构层次LVGL采用分层架构设计&#xff0c;主要包含以下几个层次&#xff1a;┌───────…

【云计算】云主机的亲和性策略(三):云主机 宿主机

《云主机的亲和性策略》系列&#xff0c;共包含以下文章&#xff1a; 1️⃣ 云主机的亲和性策略&#xff08;一&#xff09;&#xff1a;快乐旅行团2️⃣ 云主机的亲和性策略&#xff08;二&#xff09;&#xff1a;集群节点组3️⃣ 云主机的亲和性策略&#xff08;三&#xf…

【世纪龙科技】虚拟技术助力职教汽车自动变速器拆装虚拟实训软件

在职业院校汽车专业实训课堂上&#xff0c;教师常面临这样的两难&#xff1a;学生围在昂贵的自动变速器实物旁&#xff0c;却因设备数量有限只能轮流操作&#xff1b;拆装步骤稍有偏差便可能损坏精密部件&#xff0c;维修成本让本就紧张的教学经费雪上加霜&#xff1b;传统教学…

[LVGL] 配置lv_conf.h | 条件编译 | 显示屏lv_display

链接&#xff1a;https://docs.lvgl.io/master/ docs&#xff1a;LVGL LVGL&#xff08;Light and Versatile Graphics Library&#xff09;是用于在资源受限的嵌入式系统上创建图形用户界面&#xff08;GUI&#xff09;的开源解决方案。 它提供丰富的控件和灵活的**事件系…

sqli-labs通关笔记-第32关 GET宽字符注入(单引号闭合 手工注入+脚本注入两种方法)

目录 一、宽字符注入 二、代码审计 1、代码审计 2、SQL注入安全性分析 三、渗透实战 1、进入靶场 2、id1探测 3、id%df-- 探测 4、手工注入 &#xff08;1&#xff09;获取列数 &#xff08;2&#xff09;获取回显位 &#xff08;3&#xff09;获取数据库名 &…

MySQL的创建管理表:

目录 基础知识&#xff1a; 一条数据存储的过程&#xff1a; 标识符命名规则&#xff1a; 创建和管理数据库&#xff1a; 创建数据库&#xff1a; 创建数据库&#xff1a; 创建数据库并指定字符集&#xff1a; 判断数据库是否存在&#xff0c;不存在则创建数据库&#…

Linux Vi常用指令总结

Vi&#xff08;及其改进版 Vim&#xff09;是 Linux 中常用的文本编辑器&#xff0c;虽然入门有一定门槛&#xff0c;但熟练掌握后效率极高。以下是常见指令分类整理&#xff1a;1. 模式切换 普通模式&#xff08;命令模式&#xff09;&#xff1a;启动后的默认模式&#xff0c…

解决远程连接云服务器mysql编号1130问题

连接云服务器mysql失败&#xff0c;可能是因为ip发生改变&#xff0c;被mysql拦截。我自己前后做了两件事。大家赶时间可直接从二开始&#xff0c;不放心的就从一开始到结束一、在云服务器实例中为当前ip配置安全组权限。1.找到当前服务器的实例&#xff0c;进入安全组。为其增…

大数据存储域——HDFS存储系统

摘要本文介绍了HDFS存储系统&#xff0c;包括其组件、工作机制、实战经验总结、使用场景以及与SpringBoot的实战示例和优化设计。HDFS由Client、NameNode、SecondaryNameNode、DataNode等组件构成&#xff0c;通过特定的工作机制实现文件的读取和写入。它适用于多种场景&#x…

jdk动态代理如何实现

口语化答案好的&#xff0c;面试官。jdk 的动态代理主要是依赖Proxy类 和InvocationHandler 接口。jdk 动态代理要求类必须有接口。在进行实现的时候&#xff0c;首先要定义接口&#xff0c;比如MyService&#xff0c;这个接口就是我们的正常功能的实现。但是希望在不更改MySer…

自然语言处理的相关概念与问题

目录 一、学科的产生与发展 1、什么是自然语言&#xff1f; 2、自然语言处理技术的诞生 二、技术挑战 三、基本方法 1、方法概述 理性主义方法 经验主义方法 2、传统的统计学习方法 3、深度学习方法 词向量表示 词向量学习 开源工具 四、应用举例 1、汉语分词 …