Java编程思想学习笔记(七)
第四章 控制执行流程
也是经典的基础章节,找没见过的记一下8.
1.foreach语法:
float f[] = new float[10]; for(float x : f){ System.out.println(x); } //其实就是一种遍历的简化写法
for(char c : "Hello world!".toCharArray()){ System.out.println(c); } //toCharArray()是String类中的一个方法,会返回一个char数组
2.关于goto:
goto语句是在源码级别上的跳转,这也是其饱受诟病的地方,如果一个程序总是从一个地方直接跳转到另一个地方继续运行,那么其控制流程将变得难以识别。
Java中没有直接使用goto这个关键字,但是也有一些类似于这个功能的操作,涉及到break和continue。
goto语句的核心并不在于goto的跳转,而是在于标签,也就是”跳转到哪“
标签就是后面跟有冒号的标识符,例如"label1:"
在Java中,标签唯一的用处刚好是在迭代语句之前,也就是在标签和迭代语句之间插入任何的语句都是不合适的。理由是:我们希望在其中嵌套另外一个迭代或者一个开关。
label1: outer-iteration{ inner-iteration{ //... break;//(1) //... continue;//(2) //... continue label1;//(3) //... break label1;//(4) } }
(1)break中断了内部迭代,回到外部迭代
(2)continue使执行点移回内部迭代的起始处
(3)continue label1同时中断内部迭代和外部迭代,直接转到label1处继续执行,也就是从外部迭代进行接下来的过程
(4)break label1也会同时中断内外两个迭代,并回到label1处,但是不会重新进入迭代,也就是完全终止两个迭代
public class JavaLabel { public static void main(String[] args){ int i = 0; //外部循环 outer: for(;true;){ //内部循环 inner: for(; i < 10; i++){ System.out.println("i=" + i); if(i == 2){ System.out.println("continue"); continue; } if(i == 3){ System.out.println("break"); i++; break; } if(i == 7){ System.out.println("continue outer"); i++; continue outer; } if(i == 8){ System.out.println("break outer"); break outer; } for(int k = 0; k < 5; k++){ if(k == 3){ System.out.println("continue inner"); continue inner; } } } } } }
输出:
i=0 continue inner i=1 continue inner i=2 continue i=3 break i=4 continue inner i=5 continue inner i=6 continue inner i=7 continue outer i=8 break outer
从上面的例子可以看出,break label的写法可以用于跳出多层循环,continue label和正常的continue一样,会将循环的自增部分执行之后跳转到标签位置继续执行。
public class LabeledWhile { public static void main(String[] args){ int i = 0; outer: while (true){ i++; System.out.println("i = " + i); if(i == 1){ System.out.println("continue"); continue; } if(i == 3){ System.out.println("continue outer"); continue outer; } if(i == 5){ System.out.println("break"); break; } if(i == 7){ System.out.println("break outer"); break outer; } } } } //输出结果 // i = 1 // continue // i = 2 // i = 3 // continue outer // i = 4 // i = 5 // break
上面的例子是label用于while循环的,原理同for例,为了确保自加能够执行,将i++放在了循环体的开头进行执行。
总之,所谓goto有害的根本不是goto,而是标签,程序的标签变多会使程序的错误变多并且难以分析程序。但是Java的标签仅仅用于多层嵌套循环的跳出,这种限制语句能力的方法减少了由标签造成的问题。
2.13上传 第四章读完
P109
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】