前面介绍while循环时,有个名叫year的整型变量频繁出现,并且它是控制循环进出的关键要素。不管哪一种while写法,都存在三处与year有关的操作,分别是“year = 0”、“year<limit”、“year++”。第一个“year = 0”用来给该变量初始赋值,第二个“year<limit”则为是否退出循环的判断条件,第三个“year++”用于该变量的自增操作。这三处语句结合起来,方能实现循环的有限次数处理,而非无限次的运转。换句话说,要想实现一个标准的循环结构,就必须具备上述的三种基本操作。于是Java设计了新的for循环,意图让形态规整的for语句取代结构散乱的while语句。
for循环的书写格式形如“for (A; B; C;) { /* 这里是循环的内部代码 */ }”,其中式子A是初始化语句,在首次进入循环时执行;式子B是循环的判断条件,B成立时继续循环,不成立时退出循环;式子C一般是变量的自增或自减操作,在开始下一次循环之前执行。仍以前述的唤醒游戏为例,使用for语句改写后的循环代码如下所示:

		System.out.println("长夜漫漫,无心睡眠");
System.out.println("请给他设定一个睡醒的年限");
Scanner scan = new Scanner(System.in); // 从控制台接收输入文本
/* nextLine方法表示接收一行文字,以回车键结尾 */
int limit = scan.nextInt();
int year;
// for (A; B; C;)的三个式子A、B、C说明如下:
// 式子A在首次进入循环时执行;
// 式子B是循环的判断条件,B成立时继续循环,不成立时退出循环;
// 式子C在开始下一次循环之前执行。注意,每次循环结束之后,先执行式子C,再进行式子B的判断
for (year=0; year<limit; year++) {
System.out.println("已经过去的年份:"+year);
}
System.out.println("他足足睡了这么多年:"+year);

从以上代码可见,for循环把三种基本操作都放到了同一行,大大缩减了代码行数。仅仅三行for语句,等价于以下十几行的while循环代码:

		year = 0;
if (year<limit) {
while (true) {
System.out.println("已经过去的年份:"+year);
year++;
if (year<limit) {
continue;
} else {
break;
}
}
}

不过精简代码的代价是缺乏灵活性,由于for语句的条件判断默认在每次循环开始之前执行,倘若希望在循环内部的指定位置进行是否继续循环的判断,则仍然要把式子B的判断条件挪到循环里面,此时for语句原先给式子B的地方可以留空。于是挪动条件判断之后的for循环代码变成了下面这样:

		for (int year=0; ; year++) {
System.out.println("已经过去的年份:"+year);
if (year >= limit) { // 这里判断能否跳出循环
System.out.println("他足足睡了这么多年:"+year);
break; // 跳出循环。即跳到for循环的右花括号之后
} else {
continue; // 继续下一次循环。此时先执行year++,再执行循环内部语句
}
}

既然式子B原来的位置允许留空,那么只要处理得当,式子A和式子C的位置也是允许留空的。三个位置同时留空后的for循环代码示例如下:

		int year = 0; // 把式子A挪到整个循环的前面
for (; ; ) { // for语句后面的三个位置全部留空
System.out.println("已经过去的年份:"+year);
if (year >= limit) { // 这里判断能否跳出循环
System.out.println("他足足睡了这么多年:"+year);
break; // 跳出循环。即跳到for循环的右花括号之后
} else {
year++; // 把式子C挪到continue之前
continue; // 继续下一次循环。此时先执行year++,再执行循环内部语句
}
}

可是一旦紧跟for语句之后的三个位置全都留空,这个for就变得毫无特点了,此时的“for (; ; )”完全等价于“while (true)”。所以说,具体采取哪种循环形式,还得根据实际的业务要求来定夺。

Java开发笔记(十九)规律变化的for循环的更多相关文章

  1. Java开发笔记(九十一)IO流处理简单的数据压缩

    前面介绍的文件I/O,不管是写入文本还是写入对象,文件中的数据基本是原来的模样,用记事本之类的文本编辑软件都能浏览个大概.这么存储数据,要说方便确实方便,只是不够经济划算,原因有二:其一,写入的数据可 ...

  2. Java开发笔记(九十七)利用Runnable启动线程

    前面介绍了线程的基本用法,按理说足够一般的场合使用了,只是每次开辟新线程,都得单独定义专门的线程类,着实开销不小.注意到新线程内部真正需要开发者重写的仅有run方法,其实就是一段代码块,分线程启动之后 ...

  3. Java开发笔记(九)赋值运算符及其演化

    前面的加减乘除四则运算,计算结果通过等号输出给指定变量,注意此时代码把变量放到等号左边.而在算术课本里,加法运算的完整写法类似于“1+1=2”这样,运算结果应该跟在等号右边.不过代数课本里的方程式存在 ...

  4. Java学习笔记十九:Java中的访问控制修饰符

    Java中的访问控制修饰符 一:Java修饰符的种类: 访问修饰符 非访问修饰符 修饰符用来定义类.方法或者变量,通常放在语句的最前端.我们通过下面的例子来说明: public class Hello ...

  5. Java开发学习(十九)----AOP环绕通知案例之密码数据兼容处理

    一.需求分析 需求: 对百度网盘分享链接输入密码时尾部多输入的空格做兼容处理. 问题描述: 点击链接,会提示,请输入提取码,如下图所示 当我们从别人发给我们的内容中复制提取码的时候,有时候会多复制到一 ...

  6. Java开发笔记(序)章节目录

    现将本博客的Java学习文章整理成以下笔记目录,方便查阅. 第一章 初识JavaJava开发笔记(一)第一个Java程序Java开发笔记(二)Java工程的帝国区划Java开发笔记(三)Java帝国的 ...

  7. Java开发笔记(十三)利用关系运算符比较大小

    前面在<Java开发笔记(九)赋值运算符及其演化>中提到,Java编程中的等号“=”表示赋值操作,并非数学上的等式涵义.Java通过等式符号“==”表示左右两边相等,对应数学的等号“=”: ...

  8. Java开发笔记(三十九)日期工具Date

    Date是Java最早的日期工具,编程中经常通过它来获取系统的当前时间.当然使用Date也很简单,只要一个new关键字就能创建日期实例,就像以下代码示范的那样: // 创建一个新的日期实例,默认保存的 ...

  9. Java开发笔记(八十九)缓存字节I/O流

    文件输出流FileOutputStream跟FileWriter同样有个毛病,每次调用write方法都会直接写到磁盘,使得频繁的写操作性能极其低下.正如FileWriter搭上了缓存兄弟Buffere ...

  10. Java开发笔记(二十九)大整数BigInteger

    早期的编程语言为了节约计算机的内存,给数字变量定义了各种存储规格的数值类型,比如字节型byte只占用一个字节大小,短整型short占用两个字节大小,整型int占用四个字节大小,长整型long占用八个字 ...

随机推荐

  1. 34 文件地理数据库(GDB)变文件夹了怎么办

    我们都知道文件地理数据库(GDB)是ArcGIS软件特有的格式,有其独特的设计之处,在文件资源管理器中显示为.gdb的文件夹,但是里面的文件却看不明白,而且将gdb文件夹在Windows资源管理器中直 ...

  2. 如何判断dt中所有行的状态并有选择的移除

    DataRow drFocusedRow = dtCentralizerOptimalSelection.Rows[gvCentralizerOptimalSelection.FocusedRowHa ...

  3. 文件上传控件bootstrap-fileinput的使用

    1.插件下载地址:https://github.com/kartik-v/bootstrap-fileinput 2.插件的引用 需要引用jquery 需要结合bootstrap使用,即页面需要引入b ...

  4. 1 eclipse 离线安装activiti插件

    第一步:下载需要的离线activiti文件: 链接:https://pan.baidu.com/s/1-_XjIsuZfhiEZn6iLul6-Q  密码:mfyk  (这是其他网友的链接) 第二步: ...

  5. 出现 HTTP Status 500 - Servlet.init() for servlet springmvc threw exception 异常的原因及解决方法

    今天做项目的时候遇到了这个问题 其中有一句是Caused by: org.springframework.beans.factory.BeanCreationException: Error crea ...

  6. 2018 大湾区(深圳) .NET技术分享交流会 第一期

    .NET Core 2.1 已于2018年5月30日正式发布,邀请粤港澳大湾区.NET技术专家和从业人员,一起分享与交流.NET技术的发展方向,提高粤港澳大湾区.NET技术交流氛围,挖掘.NET高级人 ...

  7. 通过net time同步电脑时间

    net use \\192.168.1.112\ipc$ admin /user:admin #第一个admin是密码,第二个admin是用户名: net time \\192.168.1.112 / ...

  8. Senparc.Weixin.MP SDK 微信公众平台开发教程(二十):使用菜单消息功能

    在<Senparc.Weixin.MP SDK 微信公众平台开发教程(十一):高级接口说明>教程中,我们介绍了如何使用“客服接口”,即在服务器后台,在任意时间向微信发送文本.图文.图片等不 ...

  9. 怎么使用zepto.js的tap事件引起的探索

    前言:   在使用zepto.js之前,你首先要知道它是什么?为什么要使用它?以及它和jquery有什么区别? ①:简单来说zepto是一个轻量级的针对现代高级浏览器的JavaScript库, 它与j ...

  10. [Swift]LeetCode828. 独特字符串 | Unique Letter String

    A character is unique in string S if it occurs exactly once in it. For example, in string S = " ...