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学习笔记:流程控制的主要内容,如果未能解决你的问题,请参考以下文章

Java学习笔记之:Java流程控制

Java学习笔记五——流程控制

Java学习笔记:流程控制

java学习笔记2(datawhale教程):运算符和表达式流程控制数组

TIJ读书笔记02-控制执行流程

C语言学习笔记--条件编译