Java流程控制02:三大结构
顺序结构
所有程序都是按照顺序结构依次执行的
选择结构
if选择结构
import java.util.Scanner;
public class Hello {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int i = scanner.nextInt();
if (i > 0){
System.out.println("你输入的是正数");
}
else if(i < 0){
System.out.println("你输入的是负数");
}
else{
System.out.println("你输入的是0");
}
scanner.close();
}
}
switch多选择结构
switch...case语句匹配一个变量与一系列值中的某个值是否相等,每个值称为一个分支,相等则执行对应的分支
public class Hello {
public static void main(String[] args) {
char str = 'A';
switch (str){
case 'A': //匹配到A则执行这个分支
System.out.println("A级");
break; //case穿透,如果不加break,则会继续执行下面的分支
case 'B':
System.out.println("B级");
break;
default: //如果没有匹配到任何值,则执行默认分支
System.out.println("未知");
}
}
}
拓展:从JDK 7开始,switch支持字符串String类型
case标签必须为常量,不能是变量,因为字符的本质还是数字。Java通过编译生成class字节码文件运行,而IDEA通过反编译可以查看具体的编译过程,在IDEA中直接打开class文件就能看到反编译后的内容
编译前.java文件
import java.util.Scanner;
public class Hello {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String str = "name";
switch (str){
case "name":
System.out.println("姓名");
break;
case "age":
System.out.println("年龄");
break;
default:
System.out.println("未知");
}
scanner.close();
}
}
编译后.class文件反编译
//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by FernFlower decompiler)
//
import java.util.Scanner;
public class Hello {
public Hello() {
}
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String str = "name";
byte var4 = -1;
switch(str.hashCode()) { //可以看到字符串在编译时转换成了对应的哈希值,其本质还是通过数字来判断,所以只有常量才可以唯一识别
case 96511:
if (str.equals("age")) {
var4 = 1;
}
break;
case 3373707:
if (str.equals("name")) {
var4 = 0;
}
}
switch(var4) {
case 0:
System.out.println("姓名");
break;
case 1:
System.out.println("年龄");
break;
default:
System.out.println("未知");
}
scanner.close();
}
}
循环结构
while循环
while循环先判断条件,如果不满足,根本不会执行循环
public class Hello {
public static void main(String[] args) {
int i = 1; //初始值
int sum = 0;
while (i <= 100){ //条件判断,while循环要设置结束条件,避免死循环
sum += i; //循环体
i++; //迭代
}
System.out.println(sum);
}
}
do...while循环
do...while循环至少会执行一次
public class Hello {
public static void main(String[] args) {
int i = 1;
do {
System.out.println(i); //1,虽然i < 0不成立,但是依旧会执行一次循环
}while (i < 0);
}
}
for循环
public class Hello {
public static void main(String[] args) {
for (int i = 1; i <= 1000; i++) { //for循环语法格式:for(初始值; 条件判断; 迭代) {循环体}
if (i % 5 == 0){ //输出所有5的倍数的数字
System.out.print(i + "\t"); //print()方法输出后不换行,"\t"表示后面再输出一个tab空格,注意'\t'是不行的,这是两个字符
if (i % 15 == 0){ //每隔3个数字换行,等价为每到5 * 3 = 15的倍数时换行
System.out.println(); //直接换行
}
}
} //IDEA快捷键,输入100.for回车,会自动生成for循环
}
}
拓展:从JDK 5开始引入了一种主要用于数组或集合的增强for循环
public class Hello {
public static void main(String[] args) {
int[] num = {1, 2, 3, 4, 5}; //定义一个数组
for (int i : num){ //从数组里依次取出值,类似Python语言的for...in语句
System.out.println(i);
}
}
}
练习:输出九九乘法表
public class Hello {
public static void main(String[] args) {
int res = 0;
for (int i = 1; i <= 9; i++) {
for (int j = 1; j <= i; j++) {
res = i * j;
System.out.print(i + "*" + j + "=" + res + "\t");
}
System.out.println();
}
}
}