博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java学习笔记(四):流程控制
阅读量:6155 次
发布时间:2019-06-21

本文共 4511 字,大约阅读时间需要 15 分钟。

if语句

if判断语句比较简单,具体有下面的几种写法:

1 int i = 0; 2 // if 判断 3 if (i == 0) 4 { 5     // to do something 6 } 7 // if else 判断 8 if (i == 1) 9 {10     // to do something11 }12 else13 {14     // to do something15 }16 // if else if 判断17 if (i == 1)18 {19     // to do something20 }21 else if(i == 2)22 {23     // to do something24 }25 else if(i == 3)26 {27     // to do something28 }29 else30 {31     // to do something32 }

使用if实现条件编译

不同于C++和C#直接提供了条件编译功能,Java并没有提供相关的功能,但是我们可以巧妙的使用if来实现条件编译。

我们看一下下面的代码:

1 public class Hello {2     public static void main(String[] args) {3         if(false) {4             System.out.println("Hello, world!");5         }6     }7 }

由于Java编译器会对代码进行优化,对于条件永远为false的语句,JAVA编译器将不会对其生成字节码。

我们反编译一下上面的程序,结果如下:

1 public class Hello2 {3   public static void main(String[] paramArrayOfString)4   {5   }6 }

由此可见,我们可以通过这种方法来实现Java的条件编译:

1 package org.hammerc.study; 2  3 public class Main 4 { 5     private final boolean DEBUG = true; 6      7     public static void main(String[] args) 8     { 9         if (DEBUG)10         {11             System.out.println("Hello, world!");12         }13     }14 }

通过对DEBUG的修改来实现是否编译被if(DEBUG){}包含的代码。

3元操作符

我们看一下下面这个简单的条件判断代码:

1 int a = 100, b = 0;2 if (a > 100)3 {4     b = 1;5 }6 else7 {8     b = 2;9 }

很简单,但代码过于长了,通过3元操作符可以缩短代码,如下:

int a = 100, b = 0;b = a > 100 ? 1 : 2;

效果与上面的代码一致。

switch语句

我们先来看一个简单的例子:

1 int i = 0; 2 switch (i) 3 { 4     case 0: 5         System.out.println("0"); 6     case 1: 7         System.out.println("1"); 8         break; 9     case 2:10         System.out.println("2");11         break;12     default:13         System.out.println("3");14 }

当i=0时,会输出"0"和"1",这是因为case 0下面没有break关键字,表示不退出switch语句,当i=1和i=2时,输出"1"和"2",其他的值时输出"3"。

switch支持的类型

JDK1.5之前

switch的case语句可以处理int,short,byte,char类型的值,但是不能处理long,String等类型。因为short,byte,char都会转换成int进行处理。

JDK1.5

新加入的枚举Enum类型也是可以作为case值的。

JDK1.7

添加了对String的支持,但是仍然不支持long,后面的升级中或许会添加支持。

循环结构

while

while()括号中的表达式只要为true就执行其包含的代码,执行完毕再检测表达式是否还为true,是则继续执行,不是则退出循环。

1 int i = 0;2 while (i < 100)3 {4     System.out.println("i: " + i);5     ++i;6 }

会打印100条消息。

do while

和while相似,但是是先执行包含的代码后在检测while()括号中的表达式是否为true,是则再次执行,否则退出循环。

1 int i = 0;2 do3 {4     System.out.println("i: " + i);5     ++i;6 }7 while(i < 100);

也会打印100条消息。

for

for循环可以看做while循环的升级版,他把变量初始化,判断及每一次执行完毕要进行处理的代码都集中到一起了,如下:

for (int i = 0; i < 100; ++i){    System.out.println("i: " + i);}

效果和上面的while一致。

for each

JDK1.5中提供了另一种形式的for循环。借助这种形式的for循环,可以用更简单地方式来遍历数组和Collection等类型的对象。

我们先来看看使用老的方式遍历数组:

1 int[] arr = {1, 2, 3, 4, 5};2 for (int i = 0; i < arr.length; i++)3 {4     int item = arr[i];5     System.out.println(item);6 }

使用for each来遍历数组:

1 int[] arr = {1, 2, 3, 4, 5};2 for (int item : arr)3 {4     System.out.println(item);5 }

使用老的方式来遍历集合:

1 String[] strings = {"A", "B", "C", "D", "E"};2 Collection stringList = java.util.Arrays.asList(strings);3 for (Iterator itr = stringList.iterator(); itr.hasNext();)4 {5     Object str = itr.next();6     System.out.println(str);7 }

使用for each来遍历集合:

1 String[] strings = {"A", "B", "C", "D", "E"};2 Collection stringList = java.util.Arrays.asList(strings);3 for (Object str : stringList)4 {5     System.out.println(str);6 }

continue

continue用来退出当前的循环:

1 for (int i = 0; i < 100; i++)2 {3     if (i % 2 == 1)4     {5         continue;6     }7     System.out.println(i);8 }

这个代码会过滤掉所用奇数,只打印偶数。

break

break用来退出整个循环:

1 for (int i = 0; i < 100; i++)2 {3     if (i == 50)4     {5         break;6     }7     System.out.println(i);8 }

循环到第50次时退出循环。

label

我们来考虑一种情况,如下:

1 for (int i = 0; i < 10; i++) 2 { 3     System.out.println("i: " + i); 4     for (int j = 0; j < 10; j++) 5     { 6         System.out.println("j: " + j); 7         if (j == 5) 8         { 9             break;10         }11     }12 }

我们希望当j==5时退出两个循环,但是运行时可以发现,该break只能退出嵌套在内层的循环,这时就需要引入标签了,如下:

1 label1: 2 for (int i = 0; i < 10; i++) 3 { 4     System.out.println("i: " + i); 5     for (int j = 0; j < 10; j++) 6     { 7         System.out.println("j: " + j); 8         if (j == 5) 9         {10             break label1;11         }12     }13 }

输出如下:

1 i: 02 j: 03 j: 14 j: 25 j: 36 j: 47 j: 5

此时的break实际上是退出了两个循环,可以看做外部循环的break,所以也不会重新进入循环了。

我们再看看continue:

1 label1: 2 for (int i = 0; i < 3; i++) 3 { 4     System.out.println("i: " + i); 5     for (int j = 0; j < 3; j++) 6     { 7         System.out.println("j: " + j); 8         if (j == 1) 9         {10             continue label1;11         }12     }13 }

输出如下:

1 i: 02 j: 03 j: 14 i: 15 j: 06 j: 17 i: 28 j: 09 j: 1

此时的continue可以看做外部循环的continue,所以外部循环还是可以继续运行。

转载地址:http://jqffa.baihongyu.com/

你可能感兴趣的文章
Wait Functions
查看>>
jQuery最佳实践
查看>>
centos64i386下apache 403没有权限访问。
查看>>
jquery用法大全
查看>>
PC-BSD 9.2 发布,基于 FreeBSD 9.2
查看>>
css斜线
查看>>
Windows phone 8 学习笔记(3) 通信
查看>>
Revit API找到风管穿过的墙(当前文档和链接文档)
查看>>
Scroll Depth – 衡量页面滚动的 Google 分析插件
查看>>
Windows 8.1 应用再出发 - 视图状态的更新
查看>>
自己制作交叉编译工具链
查看>>
Qt Style Sheet实践(四):行文本编辑框QLineEdit及自动补全
查看>>
[物理学与PDEs]第3章习题1 只有一个非零分量的磁场
查看>>
深入浅出NodeJS——数据通信,NET模块运行机制
查看>>
onInterceptTouchEvent和onTouchEvent调用时序
查看>>
android防止内存溢出浅析
查看>>
4.3.3版本之引擎bug
查看>>
SQL Server表分区详解
查看>>
使用FMDB最新v2.3版本教程
查看>>
STM32启动过程--启动文件--分析
查看>>