您的位置:首页 > 编程语言 > Java开发

Java学习笔记(四):流程控制

2016-02-29 19:18 483 查看

if语句

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

int i = 0;
// if 判断
if (i == 0)
{
// to do something
}
// if else 判断
if (i == 1)
{
// to do something
}
else
{
// to do something
}
// if else if 判断
if (i == 1)
{
// to do something
}
else if(i == 2)
{
// to do something
}
else if(i == 3)
{
// to do something
}
else
{
// to do something
}


使用if实现条件编译

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

我们看一下下面的代码:

public class Hello {
public static void main(String[] args) {
if(false) {
System.out.println("Hello, world!");
}
}
}


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

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

public class Hello
{
public static void main(String[] paramArrayOfString)
{
}
}


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

package org.hammerc.study;

public class Main
{
private final boolean DEBUG = true;

public static void main(String[] args)
{
if (DEBUG)
{
System.out.println("Hello, world!");
}
}
}


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

3元操作符

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

int a = 100, b = 0;
if (a > 100)
{
b = 1;
}
else
{
b = 2;
}


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

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


效果与上面的代码一致。

switch语句

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

int i = 0;
switch (i)
{
case 0:
System.out.println("0");
case 1:
System.out.println("1");
break;
case 2:
System.out.println("2");
break;
default:
System.out.println("3");
}


当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,是则继续执行,不是则退出循环。

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


会打印100条消息。

do while

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

int i = 0;
do
{
System.out.println("i: " + i);
++i;
}
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等类型的对象。

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

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


使用for each来遍历数组:

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


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

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


使用for each来遍历集合:

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


continue

continue用来退出当前的循环:

for (int i = 0; i < 100; i++)
{
if (i % 2 == 1)
{
continue;
}
System.out.println(i);
}


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

break

break用来退出整个循环:

for (int i = 0; i < 100; i++)
{
if (i == 50)
{
break;
}
System.out.println(i);
}


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

label

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

for (int i = 0; i < 10; i++)
{
System.out.println("i: " + i);
for (int j = 0; j < 10; j++)
{
System.out.println("j: " + j);
if (j == 5)
{
break;
}
}
}


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

label1:
for (int i = 0; i < 10; i++)
{
System.out.println("i: " + i);
for (int j = 0; j < 10; j++)
{
System.out.println("j: " + j);
if (j == 5)
{
break label1;
}
}
}


输出如下:

i: 0
j: 0
j: 1
j: 2
j: 3
j: 4
j: 5


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

我们再看看continue:

label1:
for (int i = 0; i < 3; i++)
{
System.out.println("i: " + i);
for (int j = 0; j < 3; j++)
{
System.out.println("j: " + j);
if (j == 1)
{
continue label1;
}
}
}


输出如下:

i: 0
j: 0
j: 1
i: 1
j: 0
j: 1
i: 2
j: 0
j: 1


此时的continue可以看做外部循环的continue,所以外部循环还是可以继续运行。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: