狂神Java SE (四)流程控制
01 用户交互 Scanner
java.util.Scanner
Java5的新特性,可以通过Scanner
类获取用户的输入。
Scanner s = new Scanner(System.in);
- 通过
Scanner
类的next()
与nextLine()
方法获取输入的字符串 - 在读取之前一般需要使用
hasNext()
或hasNextLine()
判断是否还有输入的数据。 - 属于IO流的类如果不关闭会一直占用资源,要在用完后及时关掉
scanner.close()
next()
- 要读取到有效字符后才能结束输入
- 对输入有效字符之前遇到的空白,会自动将其去掉
- 只有输入有效字符后才将其后面输入的空白作为分隔符或结束符
next()
不能得到带有空格的字符串
nextLine()
- 以Enter作为结束符,返回的是输入回车之前的所有字符
- 可以获得空白
02 Scanner 进阶使用
scanner
还有一些其他的方法可以判断输入的是否是特定格式的数据,如hasNextInt()
,hasNextFloat()
等,然后使用对应的nextInt()
, nextFloat()
获取。
package com.kuang.base;
import java.util.Scanner;
/**
* 输入多个数字求和、求平均值,输入的数字用回车确认,输入非数字结束输入并输出结果。
*
* @author maple_w
* Created on 21/07/10 010 18:00 */
public class Demo04_scanner_test {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
double sum = 0;
int num = 0;
// 通过循环判断是否还有输入,并在循环中对每次输入进行求和、统计
while (scanner.hasNextDouble()) {
double x = scanner.nextDouble();
num++;
sum = sum + x;
System.out.println("输入了第" + num + "个数据,当前结果sum = " + sum);
}
System.out.println(num + "个数字的和为: " + sum);
System.out.println(num + "个数字的平均值为: " + (sum / num));
scanner.close();
}
}
03 顺序结构
- Java基本结构,如无特殊指明,按照顺序一句一句执行。
- 是任何一个算法都离不开的一种基本算法结构。
04 if 选择结构
- if 单选择结构
- if 双选择结构
- if 多选择结构
if(){} else if(){} else{}
- 嵌套的 if 结构
05 switch 选择结构
switch case default
语句判断一个变量与一系列值中某个值是否相等,每个值成为一个分支。switch
语句中的变量类型可以是:- byte、short、 int、 char
- String类型 (Java 7开始支持)
case标签必须为字符串常量或字面量。
通过反编译可以看到,case
比较的是字符串的hashCode()
。
- 注意
case
穿透问题(break
的使用)
package com.kuang.base;
/**
* JDK7中新增switch判断string特性
*
* @author maple_w
* Created on 21/07/10 010 18:23 */
public class Demo06_switch {
public static void main(String[] args) {
String flag = "hello";
switch (flag){
case "hello":
System.out.println("hello");
break;
case "world":
System.out.println("world");
break;
default:
System.out.println("error");
}
}
}
反编译class
文件:
//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by FernFlower decompiler)
//
package com.kuang.base;
public class Demo06_switch {
public Demo06_switch() {
}
public static void main(String[] args) {
String flag = "hello";
byte var3 = -1;
switch(flag.hashCode()) {
case 99162322:
if (flag.equals("hello")) {
var3 = 0;
}
break;
case 113318802:
if (flag.equals("world")) {
var3 = 1;
}
}
switch(var3) {
case 0:
System.out.println("hello");
break;
case 1:
System.out.println("world");
break;
default:
System.out.println("error");
}
}
}
06 while 循环详解
while(布尔表达式){
// 循环内容
}
- 只要布尔表达式为
true
,循环就会一直执行下去 - 少数情况需要循环一直执行,如服务器的请求响应监听等
07 do while 循环
do {
// 代码语句
} while(布尔表达式);
do while
循环至少会执行一次do while
先执行,后判断
08 for 循环详解
for (初始化; 布尔表达式; 更新){
// 代码语句
}
- for循环是支持迭代的一种通用结构,是最有效、最灵活的循环结构
- for循环执行的次数在执行前就已经确定了
09 打印九九乘法表
package com.kuang.base;
/**
* 使用for循环打印九九乘法表
* 1*1=1
* 2*1=2 2*2=4
* 3*1=3 3*2=6 3*3=9
* 4*1=4 4*2=8 4*3=12 4*4=16
* 5*1=5 5*2=10 5*3=15 5*4=20 5*5=25
* 6*1=6 6*2=12 6*3=18 6*4=24 6*5=30 6*6=36
* 7*1=7 7*2=14 7*3=21 7*4=28 7*5=35 7*6=42 7*7=49
* 8*1=8 8*2=16 8*3=24 8*4=32 8*5=40 8*6=48 8*7=56 8*8=64
* 9*1=9 9*2=18 9*3=27 9*4=36 9*5=45 9*6=54 9*7=63 9*8=72 9*9=81
*
* @author maple_w
* Created on 21/07/10 010 21:23
*/
public class Demo08_for {
public static void main(String[] args) {
for (int i = 1; i < 10; i++) {
for (int j = 1; j <= i; j++) {
System.out.print(i + "*" + j + "=" + i * j + "\t");
}
System.out.println();
}
}
}
10 增强 for 循环
- Java5 引入的用于数组或集合的增强for循环
for (声明语句 : 表达式){
// 代码语句
}
- 声明语句:声明新的局部变量,该变量的类型必须与数组元素的类型匹配。其作用域限定在循环语句块,其值与此事数组元素的值相等。
- 表达式:要访问的数组名,或返回值为数组的方法。
11 break、continue、goto
- break在任何循环语句的主体部分,均可以控制循环流程。用于强行退出循环,不执行循环中剩余的语句(也可以在switch语句中使用)。
- continue语句在循环语句体中,用于终止某次循环过程,即跳过循环体中尚未执行的语句,截止进行下一次是否执行循环的判定。
- goto 是保留字,但并未正式使用。称为标签,表示为
标签名:
12 打印三角形及debug
package com.kuang.base;
/**
* 打印三角形
*
* @author maple_w
* Created on 21/07/10 010 21:51
*/
public class Demo09_printTriangle {
public static void main(String[] args) {
for (int i = 1; i <= 5; i++) {
// 先打印空格
for (int j = 5; j >= i; j--) {
System.out.print(" ");
}
// 打印左侧
for (int j = 1; j <= i; j++) {
System.out.print("*");
}
// 打印右侧
for (int j = 1; j < i; j++) {
System.out.print("*");
}
System.out.println();
}
}
}