循环结构
顺序结构的程序语句只能被执行一次。如果您想要同样的操作执行多次,,就需要使用循环结构。
Java中有三种主要的循环结构:while 循环、do…while 循环 和 for 循环。
在Java5中引入了一种主要用于数组的增强型for循环。
while 循环
while是最基本的循环,它的结构为:
while( 布尔表达式 ) { //只要布尔表达式为 true,循环就会一直执行下去
//循环内容
}
下面我们举个简单的例子:
public class Test {
public static void main(String args[]) {
int x = 5;
while( x < 10 ) { // 打印输出5至9
System.out.print(x + " ");
x++;
}
}
}
do…while 循环
对于 while 语句而言,如果不满足条件,则不能进入循环。但有时候我们需要即使不满足条件,也至少执行一次。do…while 循环和 while 循环相似,不同的是,do…while 循环至少会执行一次。
do {
//循环内容
}while(布尔表达式);
布尔表达式在循环体的后面,所以语句块在检测布尔表达式之前已经执行了。 如果布尔表达式的值为 true,则语句块一直执行,直到布尔表达式的值为 false。我们把上面的例子改成用do...while实现:
public class Test {
public static void main(String args[]){
int x = 5;
do{ // 打印输出5至9
System.out.print(x + " ");
x++;
}while( x < 10 );
}
}
for循环
虽然所有循环结构都可以用 while 或者 do...while表示,但 Java 提供了另一种语句 —— for 循环,使一些循环结构变得更加简单。for循环执行的次数是在执行前就确定的。如果需要定义变量控制循环次数,建议使用for,因为for循环完毕,变量在内存中释放。语法格式如下:
for(初始化; 布尔表达式; 更新) {
//代码语句
}
关于 for 循环有以下几点说明:
1)最先执行初始化步骤。可以声明一种类型,但可初始化一个或多个循环控制变量,也可以是空语句。
2)然后,检测布尔表达式的值。如果为 true,循环体被执行。如果为false,循环终止,开始执行循环体后面的语句。
3)执行一次循环后,更新循环控制变量。
4)再次检测布尔表达式。循环执行上面的过程。
我们继续把上面的例子改成用for循环实现:
public class Test {
public static void main(String args[]) {
// 打印输出5至9
for(int x = 5; x < 10; x = x+1) {
System.out.print(x + " ");
}
}
}
同if..else语句一样,循环语句也可以嵌套,不同种类的循环之间相互嵌套也是可以的,例如while循环内嵌套for循环等等,不过我们更多使用的是for循环里嵌套for循环,也就是多层for循环嵌套。
for(初始化1; 布尔表达式1; 更新1) {
//代码语句
for(初始化2; 布尔表达式2; 更新2) {
//代码语句
}
}
增强for循环
Java5 引入了一种主要用于数组的增强型 for 循环。Java 增强 for 循环语法格式如下:
/**
* 声明语句:声明新的局部变量,该变量的类型必须和数组(集合)元素的类型匹配。
* 其作用域限定在循环语句块,其值与此时数组(集合)元素的值相等。
* 表达式:表达式是要访问的数组(集合)名,或者是返回值为数组(集合)的方法。
*/
for(声明语句 : 表达式){
//循环内容
}
下面我们举个例子来看一下:
public class Test {
public static void main(String args[]){
int [] numbers = {10, 20, 30, 40, 50};
// 输出数组元素
// for(数据类型 变量名称:数组名称){···}
for(int x : numbers ){
System.out.print( x + " ");
}
}
}
跳转控制语句
break
break语句用于终止某个语句块的执行。
使用的场景:
1)在选择结构switch语句中
2)在循环语句中
break的作用:
1)跳出单层循环
2)跳出多层循环,标签名(标号):循环语句 配合语句 break 标签名;
break语句单独存在时,下面不要定义其他语句,因为执行不到,编译会失败。当循环嵌套时,break只跳出当前所在循环。
public class Test {
public static void main(String args[]) {
int [] numbers = {10, 20, 30, 40, 50};
// 打印输出数组中前三个元素
for(int i = 0; i < numbers.length; i++) {
// 数组下标 i 等于 3时跳出循环
if( i == 3 ) {
break;
}
System.out.print( x + " ");
}
}
}
要跳出嵌套中的外部循环,只要给循环起名字即可,这个名字称之为标号。
public class Test {
public static void main(String[] args) {
int i = 0, j = 5;
i++;
tp: for(;;){
if(i > j--)
break tp;
}
}
System.out.println("i = " + i + ", j = " + j); // i=1, j=-1
}
}
continue
continue语句用于跳过某个循环语句块的一次执行 。
continue的使用场景:在循环语句中
continue的作用:退出本次循环,也可以带标签的使用
public class Test {
public static void main(String args[]) {
int [] numbers = {10, 20, 30, 40, 50};
// 打印输出数组中的所有元素
for(int x : numbers ) {
if( x == 30 ) {
// 结束本次循环,继续下次循环。该语句单独存在时,下面不可以定义语句,执行不到。
continue;
}
System.out.print( x + " ");
}
}
}
return:
return关键字不是为了跳转出循环,更常用的功能是结束(退出)一个方法,跳转到上层调用的方法。
注意:
1)break语句出现在多层嵌套的语句块中时,可以通过标签指明要终止的是哪一层语句块。
2)continue语句出现在多层嵌套的循环语句体中时,可以通过标签指明要跳过的是哪一层循环 。
3)与break和continue不同的是,return直接结束整个方法,不管这个return处于多少层循环之内。
4)break只能用于switch语句和循环语句中。continue 只能用于循环语句中。
5)标号语句必须紧接在循环的头部。标号语句不能用在非循环语句的前面。
6)break、continue之后不能有其他的语句,因为程序永远不会执行其后的语句。
无限循环和死循环
很多人把无限循环和死循环看成是一个意思的两种不同叫法,都是无休止地循环。当然并不是所有人都认同,我们先看看他们是如何理解的:
1)无限循环和死循环的相同之处就是都没有结果值。无限循环是指程序在运行过程中出现的无值结果,它的本质是程序可以正常循环,但产生的结果有无数个值;死循环是指程序在运行过程中产生的错误运算结果 ,导致程序无值判断,因此他们程序运行结果是不一样的。
2)违背设计者意愿的无限循环,称之为死循环。如果是设计者要求的无限循环就不该称之为死循环。比如操作系统的消息循环。无限循环在嵌入式开发中很是常见。
3)死循环一般是直接无法推算出的循环条件,比如返回值永远不为ture就陷入死循环,此时会吃内存,直到内存吃完,然后死机,没什么实际作用。无限循环主要是用来重复做一件事,什么时候控制自己决定,例如while(true){...}这个代码块的就是无限被执行的代码。比如使用网略协议从服务器端获取数据、建立连接后,不停的从服务器读取数据,一般会这么写:什么时候判断读完全部数据了,再跳出或返回。举个例子:当你不操作时,鼠标不动,windos一直无限循环等你操作这是无限循环当你想关广告窗口却一直弹窗时,这是死循环。
。。。。。。
其实这些理解虽然不尽相同但还是很相似的。我也不清楚Java语言中是否明确给出无限循环和死循环的区别,就是两个是不是两个不同的概念,还是说我们在翻译或这实际应用中有意识的把它们区分开来了。大家如果有人确定它们是否统一概念,欢迎在评论区留言讨论。