Java学习笔记(四):流程控制
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,所以外部循环还是可以继续运行。
Java学习笔记(四):流程控制的更多相关文章
- 【原】Java学习笔记005 - 流程控制
package cn.temptation; public class Sample01 { public static void main(String[] args) { // 程序的流程控制(流 ...
- Java学习笔记五——流程控制
分支结构 Java提供了两种常见的分支控制结构:if语句和switch语句. if语句 if语句使用布尔值或布尔表达式(表达式结果为布尔值),if语句有3中形式: 第一种形式: if (5 > ...
- 【原】Java学习笔记006 - 流程控制
package cn.temptation; public class Sample01 { public static void main(String[] args) { // 需求:写一万次&q ...
- 【原】Java学习笔记007 - 流程控制
package cn.temptation; public class Sample01 { public static void main(String[] args) { // for循环 // ...
- Java学习笔记之---流程控制语句
Java学习笔记之---流程控制语句 (一)循环语句 (1)if语句 if(布尔表达式){ //如果布尔表达式为true将执行的语句 } if(i%2!=0){ System.out.println( ...
- Java学习笔记四---打包成双击可运行的jar文件
写笔记四前的脑回路是这样的: 前面的学习笔记二,提到3个环境变量,其中java_home好理解,就是jdk安装路径:classpath指向类文件的搜索路径:path指向可执行程序的搜索路径.这里的类文 ...
- Python学习笔记 - day4 - 流程控制
Python流程控制 Python中的流程控制主要包含两部分:条件判断和循环. Python的缩进和语法 为什么要在这里说缩进和语法,是因为将要学习的条件判断和分支将会涉及到多行代码,在java.c等 ...
- java 基础知识四 流程控制
java 基础知识四 流程控制 Java流程控制包括顺序控制.条件控制和循环控制 顺序控制就是逐条执行 有if和switch两个分支 循环控制就是 又称为回路控制,根据循环初始条件和终结要求,执行 ...
- PYTHON 学习笔记2 流程控制工具以及函数定义、匿名函数
前言 在上一节的学习中.已经介绍了几种基本类型.包括字符串的定义,以及字符串中索引.切片.字符串拼接的使用方法.以及基本的整形数据运算.一些之前都没有了解过的运算符.比如 ** 乘方 //整数除法等. ...
- JavaSE学习笔记03流程控制
Java流程控制 1.顺序结构 java的基本结构就是顺序结构,除非特别指明,否则就按照顺序一句一句往下执行. 顺序结构是最简单的算法结构,它是任何一个算法都离不开的一种基本算法结构. 2. 选择结构 ...
随机推荐
- 学军NOI训练13 T3 白黑树
唉,大学军有自己的OJ就是好,无限orz 只有周六的比赛是开放的囧,这场比赛最后因为虚拟机卡住没有及时提交…… 否则就能让大家看到我有多弱了…… 前两题题解写的很详细,可以自己去看,我来随便扯扯T3好 ...
- POJ 3469 Dual Core CPU (最小割建模)
题意 现在有n个任务,两个机器A和B,每个任务要么在A上完成,要么在B上完成,而且知道每个任务在A和B机器上完成所需要的费用.然后再给m行,每行 a,b,w三个数字.表示如果a任务和b任务不在同一个机 ...
- ti processor sdk linux am335x evm /bin/unshallow-repositories.sh hacking
#!/bin/bash # # ti processor sdk linux am335x evm /bin/unshallow-repositories.sh hacking # 说明: # 本文主 ...
- 【转】This version of the rendering library is more recent than your version of ADT plug-in. Please update ADT plug-in
原文网址:http://1982106a.blog.163.com/blog/static/8436495620149239361692/ 预览layout.xml文件时提示: This versio ...
- Oracle RAC环境下如何更新patch(Rolling Patch)
Oracle RAC数据库环境与单实例数据库环境有很多共性,也有很多异性.对于数据库补丁的更新同样如此,都可以通过opatch来完成.但RAC环境的补丁更新有几种不同的更新方式,甚至于可以在零停机的情 ...
- Oracle 存储过程的创建,及触发器调用存储过程
一.创建存储过程 1.存储过程写法 create or replace procedure HVM_BYQ_TJ --变压器统计信息--->入库 (id in number) as begin ...
- Android UI开发详解之Fragment
Fragment是Android自从3.0之后新加入的一个组件,我相信很多人都已经听说过这个组件了,但这个组件到底是个什么,如何去使用他呢,且听我讲来. 以下部分资料来自官网(官网才是王道,其他都是浮 ...
- Asp.Net中的获取Web.config中设置的参数!(前后台的代码示例)
一.Web.config中设置代码 <appSettings> <add key="deleted" value="1" ...
- 宏定义(#define)和常量(const)的区别
最近开始准备一边做实验室的研究,一边记录一些遇到的编程中的小知识点.今天在测试对矩阵进行SVD分解时,需要定义矩阵的行和列的大小,我习惯性的用宏定义来定义了这两个变量,在运行的时候,就开始思考宏定义和 ...
- java 拷贝功能
java 中的 拷贝分为浅拷贝 和 深拷贝 浅拷贝需要实现Cloneable接口,深拷贝需要实现Serializable接口. public class Square implements Clone ...