Java流程控制
1. 用户交互Scanner
Scanner对象
-
程序和人的交互,通过java.util.Scanner类来获取用户的输入
-
基本语法
Scanner s = new Scanner(System.in);
-
通过Scanner类的next()与nextline()方法,可以获取输入的字符串,在读取前我们一般需要使用hasNext()与hasNextLine()判断是否还有输入的数据。
-
next():
- 一定要读取到有效字符后才可以结束输入
- 对输入的有效字符之前的空白,next()方法会自动将其去掉
- 只有在输入有效字符后,才将其后面输入的空白作为分隔符或者结束符
- next()不能得到带有空格的字符串
-
nextLine():
- 以Enter为结束符,也就是说nextLine()方法返回的是输入回车之前的所有字符
- nextLine()可以获得空白字符串
-
close():
- scanner.close(); 输入完成后,应使用close()将输入流关闭。
2. Scanner进阶使用
Scanner的其他方法
-
hasNextInt()、hasNextDouble()、hasNextFloat()等等,判断输入是否为某种类型的数据
-
nextInt()、nextDouble()、nextFloat()、nextByte()等等,接收某种类型的数据
3. 顺序结构
-
Java的基本结构就是顺序结构,除非特别指明,否则程序就按照顺序一句一句执行
-
顺序结构是最简单的算法结构
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nBXglbxK-1643353901657)(E:\java\图片资料\程序流程结构-顺序.png)]
-
语句与语句之间,框与框之间是按从上到下的顺序进行的,它是由若干个依次执行的处理步骤组成的,它是任何一个算法都离不开的一种基本算法结构。
4. if选择结构
-
if单选择结构
-
我们很多时候需要去判断一个东西是否可行,然后才去执行,这样一个过程在程序中用if语句来表示
-
语法:如果布尔表达式的值为 true,则执行 if 语句中的代码块,否则执行 if 语句块后面的代码
if(布尔表达式){ //如果布尔表达式为true将执行的语句 }
-
-
if双选择结构
-
有时候我们需要有两个判断,需要一个双选择结构,true做什么,false做什么
-
语法:
if(布尔表达式){ //如果布尔表达式的值为true }else{ //如果布尔表达式的值为false }
-
-
if多选择结构
-
有时候需要多重选择,多分段判断,就需要if多选择结构
-
语法:
if(布尔表达式1){ //如果布尔表达式1的值为true,要执行的代码 }else if(布尔表达式2){ //如果布尔表达式2的值为true,要执行的代码 }else if(布尔表达式3){ //如果布尔表达式3的值为true,要执行的代码 }else{ //如果以上条件都不为true时,要执行的代码 }
-
注意事项
- if 语句至多有 1 个 else 语句,else 语句在所有的 else if 语句之后。
- if 语句可以有若干个 else if 语句,它们必须在 else 语句之前。
- 一旦其中一个 else if 语句检测为 true,其他的 else if 以及 else 语句都将跳过执行。
-
-
嵌套的if结构
-
使用嵌套的 if…else 语句是合法的。也就是说你可以在另一个 if 或者 else if 语句中使用 if 或者 else if 语句。
-
语法:
if(布尔表达式1){ //如果布尔表达式1的值为true,要执行的代码 if(布尔表达式2){ //如果布尔表达式2的值为true,要执行的代码 } }
-
5. switch选择结构
-
switch case 语句判断一个变量与一系列值中某个值是否相等,每个值称为一个分支。
-
语法:
switch(expression){ case value : //语句 break; //可选 case value : //语句 break; //可选 //你可以有任意数量的case语句 default : //可选 //语句 }
-
switch case语句规则
- switch 语句中的变量类型可以是: byte、short、int 或者 char。从 Java SE 7 开始,switch 支持字符串 String 类型了,同时 case 标签必须为字符串常量或字面量。
- switch 语句可以拥有多个 case 语句。每个 case 后面跟一个要比较的值和冒号。
- case 语句中的值的数据类型必须与变量的数据类型相同,而且只能是常量或者字面常量。
- 当变量的值与 case 语句的值相等时,那么 case 语句之后的语句开始执行,直到 break 语句出现才会跳出 switch 语句。
- 当遇到 break 语句时,switch 语句终止。程序跳转到 switch 语句后面的语句执行。case 语句不必须要包含 break 语句。如果没有 break 语句出现,程序会继续执行下一条 case 语句,直到出现 break 语句。
- switch 语句可以包含一个 default 分支,该分支一般是 switch 语句的最后一个分支(可以在任何位置,但建议在最后一个)。default 在没有 case 语句的值和变量值相等的时候执行。default 分支不需要 break 语句。
6. while循环详解
-
while是最基本的循环,其结构为:
while(布尔表达式){ //循环内容 }
-
只要布尔表达式为true,循环就会一直执行下去
-
我们大多数情况是会让循环停止下来的,我们需要一个让表达式失效的方式来结束循环
-
少部分情况需要循环一直执行,比如服务器的请求响应监听等
-
循环条件一直为true就会造成无限循环(死循环),我们正常的业务编程中应尽量避免死循环。会影响程序性能或者造成程序卡死崩溃!
-
思考:计算1+2+3+…+100=?
public class whileDemo02 { public static void main(String[] args) { //输出1+2+3+。。。+100= int i = 1; int sum = 0; while(i<=100){ sum+=i; i++; } System.out.println("1+2+3+...+100="+sum); } }
7. DoWhile循环
-
对于while循环而言,如果条件不满足,循环可能一次也不会被执行。但有时候我们需要即使不满足条件,也至少执行一次。因此,就有了do while循环
-
do…while循环至少会执行一次
do{ //代码语句 }while(布尔表达式);
-
while和do-while的区别
- while先判断后执行,而do-while是先执行后判断
- **do-while总是保证循环体会被至少执行一次!**这是它们的主要差别。
public class doWhileDemo01 { public static void main(String[] args) { //do-while循环 int i = 1; int sum = 0; do { sum+=i; i++; }while(i<=100); System.out.println("1+2+3+...+100="+sum); } }
8. For循环详解
-
虽然所有循环结构都可以用while或者do-while表示,但Java提供了另一种循环语句–for循环,使得一些循环结构变得更简单
-
for循环语句是支持迭代的一种通用结构,是最有效、最灵活的循环结构
-
for循环执行的次数是在执行之前就确定的。语法:
for(初始化;布尔表达式;更新){ //代码语句 }
-
练习:
-
练习1:计算0到100之间的奇数和、偶数和
public class ForDemo02 { public static void main(String[] args) { //计算0到100之间的奇数和、偶数和 int sumOdds = 0; int sumEvens = 0; for (int i = 1; i <= 100; i+=2) { sumOdds+=i; sumEvens+=i+1; } System.out.println("0-100之间的奇数和="+sumOdds+",偶数和="+sumEvens); } }
-
练习2:用while或for循环输出1~1000之间能被5整除的数,并且每行输出5个
public class ForDemo03 { public static void main(String[] args) { //用while或for循环输出1~1000之间能被5整除的数,并且每行输出5个 for (int i = 1; i <= 1000; i++) { if (i % 5 == 0) { System.out.print(i+"\t\t"); } if(i % (5*5) == 0) { //每输出5个数换行 System.out.println(); } } } }
-
练习3:打印九九乘法表
public class ForDemo04 { public static void main(String[] args) { //打印九九乘法表 for (int i = 1;i <= 9;i++){ for(int j = 1;j <= i;j++){ System.out.print(i+"*"+j+"="+i*j+"\t"); } System.out.println(); } } }
关于for循环的几点说明
- 最先执行初始化步骤。可以声明一种类型,但可初始化一个或多个循环控制变量,也可以是空语句。
- 然后,检测布尔表达式的值。如果为true,循环体被执行;如果为false,循环体终止,开始执行循环体后面的语句。
- 执行一次循环后,更新循环控制变量(迭代因子控制循环变量的增减)。
- 再次检测布尔表达式。循环执行上面的过程
-
9. 增强for循环
-
这里我们先有个印象,做个了解,之后数组学习时重点使用和练习
-
Java5引入了一种主要用于数组或集合的增强型for循环
-
Java增强for循环的语法:
for(声明语句:表达式){ //代码语句 }
-
声明语句:声明新的局部变量,该变量的类型必须和数组元素的类型匹配。其作用域限定在循环语句块,其值与此时数组元素的值相等。
-
表达式:表达式是要访问的数组名,或者是返回值为数组的方法。
public class ForDemo05 { public static void main(String[] args) { //增强for循环 int[] numbers = {10,20,30,40,50,60}; //定义一个数组,并初始化 //使用for循环遍历数组元素,并输出 for (int i=0;i<=5;i++){ System.out.println(numbers[i]); } System.out.println("-----下面使用增强for循环遍历数组------"); //使用增强for循环遍历数组元素,并输出 for(int x:numbers){ System.out.println(x); } } }
10. break、continue、goto
- break在任何循环语句的主体部分,均可用break控制循环的流程。break用于强行退出循环,不执行循环中剩余的语句。(break语句也在switch语句中使用)
- continue语句用在循环语句体中,用于终止某次循环过程,即跳过循环体中尚未执行的语句,接着进行下一次是否执行循环的判定。
- goto关键字
- 尽管goto仍是Java的一个保留字,但并未在语句中得到正式使用,Java中没有goto。然而,在break和continue这两个关键字身上,仍然能看出一些goto的影子---->带标签的break和continue。
- ”标签“是指后面跟一个冒号的标识符,例如:label:
- 对Java来说,唯一用到标签的地方是在循环语句之前。而在循环语句之前设置标签的唯一理由是:我们希望在其中嵌套另一个循环,由于break和continue关键字通常只中断当前循环,但若随同标签使用,它们就会中断到存在标签的地方。
11. 打印三角形及Debug
public class TestDemo01 {
public static void main(String[] args) {
//练习:打印三角形, 5行由*组成的三角形
final int ROWS = 5;
for (int i = 1; i <= ROWS; i++) {
for (int j = ROWS-1; j >= i ; j--) {
System.out.print(" ");
}
for (int j = 1; j <=(i*2-1); j++) {
System.out.print("*");
}
System.out.println();
}
}
}
输出结果:
*
***
*****
*******
*********
------------------------------“笔记整理自跟着《狂神说Java》”----------------------------------