Java学习笔记:流程控制
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java学习笔记:流程控制相关的知识,希望对你有一定的参考价值。
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 something 11 } 12 else 13 { 14 // to do something 15 } 16 // if else if 判断 17 if (i == 1) 18 { 19 // to do something 20 } 21 else if(i == 2) 22 { 23 // to do something 24 } 25 else if(i == 3) 26 { 27 // to do something 28 } 29 else 30 { 31 // to do something 32 }
使用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 Hello 2 { 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 else 7 { 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 do 3 { 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: 0 2 j: 0 3 j: 1 4 j: 2 5 j: 3 6 j: 4 7 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: 0 2 j: 0 3 j: 1 4 i: 1 5 j: 0 6 j: 1 7 i: 2 8 j: 0 9 j: 1
此时的continue可以看做外部循环的continue,所以外部循环还是可以继续运行。
以上是关于Java学习笔记:流程控制的主要内容,如果未能解决你的问题,请参考以下文章