Java开发笔记(十九)规律变化的for循环
前面介绍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循环的更多相关文章
- Java开发笔记(九十一)IO流处理简单的数据压缩
前面介绍的文件I/O,不管是写入文本还是写入对象,文件中的数据基本是原来的模样,用记事本之类的文本编辑软件都能浏览个大概.这么存储数据,要说方便确实方便,只是不够经济划算,原因有二:其一,写入的数据可 ...
- Java开发笔记(九十七)利用Runnable启动线程
前面介绍了线程的基本用法,按理说足够一般的场合使用了,只是每次开辟新线程,都得单独定义专门的线程类,着实开销不小.注意到新线程内部真正需要开发者重写的仅有run方法,其实就是一段代码块,分线程启动之后 ...
- Java开发笔记(九)赋值运算符及其演化
前面的加减乘除四则运算,计算结果通过等号输出给指定变量,注意此时代码把变量放到等号左边.而在算术课本里,加法运算的完整写法类似于“1+1=2”这样,运算结果应该跟在等号右边.不过代数课本里的方程式存在 ...
- Java学习笔记十九:Java中的访问控制修饰符
Java中的访问控制修饰符 一:Java修饰符的种类: 访问修饰符 非访问修饰符 修饰符用来定义类.方法或者变量,通常放在语句的最前端.我们通过下面的例子来说明: public class Hello ...
- Java开发学习(十九)----AOP环绕通知案例之密码数据兼容处理
一.需求分析 需求: 对百度网盘分享链接输入密码时尾部多输入的空格做兼容处理. 问题描述: 点击链接,会提示,请输入提取码,如下图所示 当我们从别人发给我们的内容中复制提取码的时候,有时候会多复制到一 ...
- Java开发笔记(序)章节目录
现将本博客的Java学习文章整理成以下笔记目录,方便查阅. 第一章 初识JavaJava开发笔记(一)第一个Java程序Java开发笔记(二)Java工程的帝国区划Java开发笔记(三)Java帝国的 ...
- Java开发笔记(十三)利用关系运算符比较大小
前面在<Java开发笔记(九)赋值运算符及其演化>中提到,Java编程中的等号“=”表示赋值操作,并非数学上的等式涵义.Java通过等式符号“==”表示左右两边相等,对应数学的等号“=”: ...
- Java开发笔记(三十九)日期工具Date
Date是Java最早的日期工具,编程中经常通过它来获取系统的当前时间.当然使用Date也很简单,只要一个new关键字就能创建日期实例,就像以下代码示范的那样: // 创建一个新的日期实例,默认保存的 ...
- Java开发笔记(八十九)缓存字节I/O流
文件输出流FileOutputStream跟FileWriter同样有个毛病,每次调用write方法都会直接写到磁盘,使得频繁的写操作性能极其低下.正如FileWriter搭上了缓存兄弟Buffere ...
- Java开发笔记(二十九)大整数BigInteger
早期的编程语言为了节约计算机的内存,给数字变量定义了各种存储规格的数值类型,比如字节型byte只占用一个字节大小,短整型short占用两个字节大小,整型int占用四个字节大小,长整型long占用八个字 ...
随机推荐
- 设置mysql InnoDB存储引擎下取消自动提交事务
mysql 存储引擎中最长用的有两种,MyISAM 存储引擎和InnoDB存储引擎. 1.MyISAM 存储引擎 不支持事务,不支持外键,优势是访问速度快: 2.InnoDB存储引擎 支持事务,一般项 ...
- [Swift]LeetCode507. 完美数 | Perfect Number
We define the Perfect Number is a positive integer that is equal to the sum of all its positive divi ...
- [Swift]LeetCode652. 寻找重复的子树 | Find Duplicate Subtrees
Given a binary tree, return all duplicate subtrees. For each kind of duplicate subtrees, you only ne ...
- [Swift]LeetCode746. 使用最小花费爬楼梯 | Min Cost Climbing Stairs
On a staircase, the i-th step has some non-negative cost cost[i] assigned (0 indexed). Once you pay ...
- [Swift]LeetCode788. 旋转数字 | Rotated Digits
X is a good number if after rotating each digit individually by 180 degrees, we get a valid number t ...
- [Swift]LeetCode823. 带因子的二叉树 | Binary Trees With Factors
Given an array of unique integers, each integer is strictly greater than 1. We make a binary tree us ...
- AspNetCoreMvc使用MongoDB,快来get一下吧。
看这篇文章之前请耐心看完MongoDb入门,如果还是坚持不看,那我也没有办法. MongoDB是一个基于分布式文件存储的数据库.由C++语言编写.旨在为WEB应用提供可扩展的高性能数据存储解决方案. ...
- 『字符串模式匹配 KMP』
字符串模式匹配 我们要先了解一下问题是什么. 模式匹配是数据结构中字符串的一种基本运算,给定一个子串,要求在某个字符串中找出与该子串相同的所有子串,这就是模式匹配. KMP 然后我们来认识一下今天的主 ...
- .NET Core 2.x中使用Named Options处理多个强类型配置实例
来源: Using multiple instances of strongly-typed settings with named options in .NET Core 2.x 作者: Andr ...
- mybatis中的缓存问题
关于mybatis基础我们前面几篇博客已经介绍了很多了,今天我们来说一个简单的问题,那就是mybatis中的缓存问题.mybatis本身对缓存提供了支持,但是如果我们没有进行任何配置,那么默认情况下系 ...