这是我参与 {第三届青训营-后端场}笔记创作活动的第4篇笔记~
Java 基础--流程控制
1. Scanner 获取用户输入
Java提供了Scanner工具类可以获取用户输入,java.util.Scanner是JDK5的新特性。
- 基本语法
Scanner sc = new Scanner(System.in);
通过Scanner的next()与nextLine()获取输入,hasNext()与hasNextLine()判断是否还有输入的数据。
next()与hasNext()方法的测试:
package com.zhang.scanner; import java.util.Scanner; public class Demo01 { public static void main(String[] args) { // 实例化scanner对象 Scanner scanner = new Scanner(System.in); System.out.println("请输入数据:"); if(scanner.hasNext()){ String str = scanner.next(); System.out.println("获取到的用户输入为:"+str); } // scanner 为IO资源,用完之后记得要进行关闭,避免资源浪费 scanner.close(); } }输出结果:
这里注意到:使用next()方法只能获取到 通过空格对输入进行切分,得到第一个非空格串
hasNextLine()与NextLine()的方法测试
package com.zhang.scanner; import java.util.Scanner; public class Demo02 { public static void main(String[] args) { // 实例化scanner对象 Scanner scanner = new Scanner(System.in); System.out.println("请输入数据:"); if(scanner.hasNextLine()){ String str = scanner.nextLine(); System.out.println("获取到的用户输入为:"+str); } // scanner 为IO资源,用完之后记得要进行关闭,避免资源浪费 scanner.close(); } }输出结果:
这里注意到nextLine()方法获取到的内容为回车符前面的所有输入
Scanner进阶使用
Scanner除了获取字符串,还能通过判断输入是否为int 、float、double类型数据,从而进行下一步操作,搭配使用方法为:nextInt()&hasNextInt()、nextFloat()&hasNextFloat()、nextDouble&hasNextDouble();
package com.zhang.scanner; import java.util.Scanner; public class Demo03 { public static void main(String[] args) { // 实例化Scanner对象用于获取用户输入数据 Scanner scanner = new Scanner(System.in); // 用于存储scanner接收到的数据 int i; float f; System.out.println("请输入数据:"); if(scanner.hasNextInt()) { i = scanner.nextInt(); System.out.println("输入的整数数据是" + i); }else{ System.out.println("输入的数据不是整数!"); } if(scanner.hasNextFloat()){ f = scanner.nextFloat(); System.out.println("输入的浮点型数据是"+f); }else{ System.out.println("输入的数据不是浮点型"); } // IO资源使用结束后关闭 scanner.close(); } }输出的结果是:
问题:通过Scanner实现输入多个数据int,并求其和、平均值。
package com.zhang.scanner; import java.util.Scanner; public class Demo04 { public static void main(String[] args) { // 实例化一个Scanner对象,用于获取用户输入 Scanner scanner = new Scanner(System.in); // num用于记录输入了多少个数据 ,temp用于存储当前输入 ,sum用于求和 int num = 0; int temp = 0; double sum = 0.0; System.out.println("请输入整数,输入非整数结束"); while(scanner.hasNextInt()){ temp = scanner.nextInt(); num++; // ++num num = num + 1 num += 1 sum += temp; System.out.println("当前输入的第"+num+"个数是"+temp+",现在总和为"+sum); } System.out.println("一共输入了"+num+"个数"); System.out.println(sum+"的平均值为"+sum/num); // 关闭IO资源,避免资源浪费 scanner.close(); } }代码测试:
2. 流程控制
顺序结构
Java的基本结构就是顺序结构,代码一句一句执行。
语句与语句之间,框与框之间都是按照顺序进行的,它是由若干个依次执行的处理步骤组成,任何一个算法都无法离开顺序结构。
public class Demo01{ public static void main(String[] args){ // 观察输出结果 System.out.println("1"); System.out.println("2"); System.out.println("3"); System.out.println("4"); } }选择结构
if 条件结构 有单选结构、双选结构和多选结构,亦存在嵌套结构。
if的单选结构语法:
if(条件为真){ 执行该部分语句 }比如在程序中判断某个条件是否成立时,可以使用单选结构。
if的双选结构语法:
if (条件为真){ 执行该部分语句 }else{ 条件不真 }比如判断语句存在非此即彼的情况。
if的多选结构语法:
if(条件为真){ 执行该部分语句 }else if(条件为真){ 执行该部分语句 }..... else{ 以上情况都不成立 } 在程序判断中,必须成绩的评级A、B、C、D级等多种情况可以考虑使用多选结构,并且多选结构语法只执行其中一个,若某个条件判断为真,执行该部分语句后,跳过其他 else if 、else判断,并且 else放在多选结构的最后面。
嵌套if的语法:
if(条件为真){
if(条件为真){
..... 里面可以继续嵌套使用,可以嵌套的内容有单选结构、双选结构和多选结构。
}
}
switch多选择结构
switch case 语句适用于判断一个变量与一系列值中的某个值是否相等,每个值称为一个分支。
语法:
switch(表达式){ case value1: 语句 break; //可选 case value2: 语句 break; // 可选 ... 可以有任意数量的case语句 default: 可选 // 语句 }value支持 byte、short、int和char,但是从JDK7开始,支持String类型对象的比较。
如果不写break会出现case穿透现象,意思就是执行完该分支后继续向下执行
public class Demo{ public static void main(String[] args){ char grade = 'A'; switch(grade){ case 'A': System.out.println("A"); break; case 'B': System.out.println("B"); case 'C': System.out.println("C"); default: System.out.println("None"); } } }当 grade = 'A'时,输出的值为 A,当 grade= 'B'时,输出的值有 B C None,这是因为case 'B'分支漏了写break,出现了case穿透现象。
2. 循环语句
1. while循环
语法结构
while(表达式){ 循环体语句 }
- 只要表达式语句结果一直都为true,就会无休止的执行循环体语句,大多数情况下会选择在循环体内使得表达式失效;
- 生活中服务器监听会一直循环执行;
思考使用while循环实现 1 + .... + 100=?
int i = 0; int sum = 0; while(i < 100){ sum += ++i; }2. do-while循环
语法结构
do{ 循环体语句 }while(表达式)
- do-while循环至少会执行循环体内的语句一次;
- do-while循环是先执行循环体语句再执行表达式的判断
int a = 0; while(a<0){ System.out.println("hello"); } ================================== do{ System.out.println("world"); }while(a<0);观察结果输出可以看出while循环与do-while循环的区别。
3. for循环
for循环使用起来比while和do-while更方便和简单,在编程中使用的更多
语法结构:
for(初始条件;判断表达式;更新){ 循环体语句 }for循环执行规则:1、执行初试条件进行初始化;2、通过判断表达式进行判断;若结果为true则执行循环体语句,否则跳出for循环;3、更新表达式的值;4、重复2、3步骤。这个过程就好像心形一样,因此也叫做心形循环。
再IDEA中 快速 输入 for(int i = 0; i < 100; i +++){} ----------------> 100.for
对比for与while循环:
public class Demo{ public static void main(String[] args){ int i = 0; // 循环输出 0-99 的while方式 while(i < 100 ) { System.out.println(i++); } System.out.println("==============="); // 循环输出 1-100 的for方式 for(int i = 0; i < 100; i ++){ System.out.println(i); } } }练习:
计算1-100所有奇数和偶数和并且输出;
实现99乘法表输出;
package com.zhang.struct; import java.sql.SQLOutput; public class ForDemo01 { // 通过for循环实现0-100的奇数、偶数和 public static void main(String[] args) { int evenNum = 0; //偶数和 int oddNum = 0; //奇数和 for (int i = 0; i <= 100; i++) { // 判断是否为偶数 if(i%2==0){ // 统计偶数和 evenNum+=i; }else{ // 统计奇数和 oddNum+=i; } } System.out.println("1-100偶数和为:"+evenNum); System.out.println("1-100奇数和为:"+oddNum); } }package com.zhang.struct; public class ForDemo02 { // 通过嵌套for循环实现99乘法表 public static void main(String[] args) { // 外层循环控制行数 for (int i = 1; i < 10; i++) { // 内层循环控制列数 for (int j = 1; j <= i; j++) { // print & println 区别: print不会换行 println equals to print("\n") System.out.print(j + "*" + i + "=" + i * j+"\t"); } System.out.println(); } } }试想一个问题:for循环遍历数组里面的每一个元素
int[] numbers = {1,2,3,4,5}; // 定义一个长度为5的int数组 for(int i = 0; i < 5; i ++){ System.out.println(numbers[i]); }这样子写起来比较麻烦也不方便比如需要知道数组长度,但是JDK5引入了新特性,增强型for循环。
int[] numbers = {1,2,3,4,5}; for(int x : numbers){ System.out.println(x); }需要注意以下几点:
- 上式中的x数据类型要与数组类型相同;
- x是局部变量,作用域只在该循环体内;
- 增强型for重点是为了遍历数组和集合。
break&continue
break & continue 是Java保留的两个关键字,有特殊的含义。
break
用于循环体内,控制循环体的流程,其目的是强制退出循环,剩余的循环语句全部不执行。
continue
用于循环体内,其目的是跳过本次循环,然后开始下一次循环
package com.zhang.struct; public class Demo03 { public static void main(String[] args) { // break 结束循环 for (int i = 0; i < 10; i++) { if(i == 5)break; System.out.print(i+"\t"); } System.out.println(); // continue 结束本次循环 for (int i = 0; i < 10; i++) { if(i == 5)continue; System.out.print(i+"\t"); } } }输出结果: