Java大数据开发和安全开发
(一)Java的流程控制
程序中最经典的三种执行顺序
1.1 分支语句
1.1.1 IF分支语句
- 根据条件(真或假)来决定是否执行某段代码。
- IF分支语句有三种表达方式
1.1.1.1 第一种IF语句
执行流程:
- ① 首先判断条件表达式的结果,如果**
为true执行语句体,为 false 就不执行语句体
**
注意事项:
- if 语句中,如果大括号控制的只有一行代码,则大括号可以省略不写
public class IfDemo {
public static void main(String[] args) {
// 目标:需要同学们掌握1f分支三种形式的用法和执行流程
// 需求:测量用户体温,发现体温高于37度就报警。
double t = 36.9;
if (t > 37) {
System.out.println("这个人的温度异常,把他赶紧带走~~");
}
}
}
1.1.1.2 第二种IF-ELSE语句
执行流程:
- ① 首先判断条件表达式的结果,如果为true执行语句体1,为 false 就执行语句体2
public class IfDemo {
public static void main(String[] args) {
// 需求2:发红包,你的钱包余额是99元,现在要发出90元
// 如果钱够触发发红包的动作,如果钱不够,则提示:余额不足。
double money = 19;
if (money >= 90) {
System.out.println("发红包成功了~");
} else {
System.out.println("余额不足~~");
}
}
}
1.1.1.3 第三种IF-ELSE IF-ELSE语句
执行流程:
- ① 先判断条件1的值,如果为true则执行语句体1,分支结束;如果为false则判断条件2的值
- ②如果值为true就执行语句体2,分支结束;如果为false则判断条件3的值
- ③…
- ④如果没有任何条件为true,就执行else分支的语句体n+1。
public class IfDemo {
public static void main(String[] args) {
//需求3:某个公司有一个绩效系统,根据员工的打分输出对应的绩效级别。[0,60)D [60,80)C[80,90)B[90,100]A
double KPI=800;
if (KPI >= 90 && KPI <= 100){
System.out.println("绩效为A");
} else if (KPI >= 80 && KPI < 90) {
System.out.println("绩效为B");
} else if (KPI >= 60 && KPI < 80) {
System.out.println("绩效为C");
} else if (KPI >= 0 && KPI < 60) {
System.out.println("绩效为D");
} else {
System.out.println("输入有误!");
}
}
}
1.1.1.4 if语句使用的几个常见问题
- if(条件){} ,()后不能跟“;”否则{}中的代码将不受if的控制了
- 如果if语句的0中只有一行代码的情况,(}可以省略不写(但是不推荐省略)
1.1.2 switch分支语句
- 是通过比较值来决定执行哪条分支
1.1.2.1 switch分支的执行流程
①先执行表达式的值,再拿着这个值去与case后的值进行匹配。
②与哪个case后的值匹配为true就执行哪个case块的代码,遇到break就跳出switch分支。
③如果全部case后的值与之匹配都是false,则执行default块的代码,
1.1.2.2 switch分支的导学案例:电子备忘录
- 周一:埋头苦干,解决bug
- 周二:请求大牛程序员帮忙
- 周三:今晚啤酒、龙虾、小烧烤
- 周四:主动帮助新来的女程序解决bug
- 周五:今晚吃鸡
- 周六:与王婆介绍的小芳相亲
- 周日:郁郁寡欢、准备上班
/**
目标:掌握switch的写法,理解其执行流程
*/
public class SwitchDemo {
public static void main(String[] args) {
/*
- 周一:埋头苦干,解决bug
- 周二:请求大牛程序员帮忙
- 周三:今晚啤酒、龙虾、小烧烤
- 周四:主动帮助新来的女程序解决bug
- 周五:今晚吃鸡
- 周六:与王婆介绍的小芳相亲
- 周日:郁郁寡欢、准备上班
*/
String week ="周三";
switch(week) {
case "周一":
System.out.println("埋头苦干,解决bug");
break;
case "周二":
System.out.println("请求大牛程序员帮忙");
break;
case "周三":
System.out.println("今晚酒、龙虾、小烧烤");
break;
case "周四":
System.out.println("主动帮助新来的女程序解决bug");
break;
case "周五":
System.out.println("今晚吃鸡");
break;
case "周六":
System.out.println("与王婆介绍的小芳相亲");
break;
case "周日":
System.out.println("郁郁寡欢、准备上班");
break;
default:
System.out.println("您输入的星期信息肯定是不存在的~~");
}
}
}
1.1.2.3 if、switch的比较,以及各自适合什么业务场景?
- if在功能上远远强大于switch。
- 当前条件是区间的时候,应该使用if分支结构,
- 当条件是与一个一个的值比较的时候,switch分支更合适:格式良好,性能较好,代码优雅。
1.1.2.4 使用switch分支的几点注意事项
- 表达式类型只能是byte、short、int、char,JDK5开始支持枚举,JDK7开始支持String.1)
不支持double、float、long。 - case给出的值不允许重复,且只能是字面量,不能是变量。
- 正常使用switch的时候,不要忘记写break,否则会出现穿透现象
public class SwitchDemo2 {
public static void main(String[] args) {
// 目标:搞清楚switch使用时的几点注意事项。
//1、表达式类型只能是byte、short、int、char,JDK5开始支持枚举,JDK7开始支持string、不支持double、float、long.
int a = 10;
double b = 0.1;
double b2 = 0.2;
double c = b + b2; //c的值看似是0.3,实际上是0.30000000000000004
System.out.println(c);
switch (c) { //double 报错!
case 0.3: //c=0.30000000000000004 不等于0.3永远执行不到这个case
break;
}
//2、case给出的值不允许重复,且只能是字面量,不能是变量。
int i = 20;
int d = 20;
switch (i) {
case 20: //case给出的值不允许重复 报错!
break;
case 20:
break;
case d: //case给出的值只能是字面量,不能是变量 报错!
break;
}
//正常使用switch的时候,不要忘记写break,否则会出现穿透现象。
String week ="周一";
switch(week) {
case "周一":
System.out.println("埋头苦干,解决bug");
//break; 不写break 就继续执行下一个case 会出现穿透现象
case "周二":
System.out.println("请求大牛程序员帮忙");
break;
default:
System.out.println("您输入的星期信息肯定是不存在的~~");
}
}
}
0.30000000000000004
埋头苦干,解决bug
请求大牛程序员帮忙
1.1.2.5 switch穿透性在些情况下可以简化代码
- 当存在多个case分支的代码相同时,可以把相同的代码放到一个case块中,其他的case块都通过穿透性穿透到该case块执行代码即可,这样可以简化代码。
public class SwitchDemo3 {
public static void main(String[] args) {
/*
- 周一:埋头苦干,解决bug
- 周二:请求大牛程序员帮忙
- 周三:今晚啤酒、龙虾、小烧烤
- 周四:主动帮助新来的女程序解决bug
- 周五:今晚吃鸡
- 周六:与王婆介绍的小芳相亲
- 周日:郁郁寡欢、准备上班
*/
String week ="周二";
switch(week) {
case "周一":
System.out.println("埋头苦干,解决bug");
break;
case "周二":
case "周三":
case "周四":
System.out.println("请求大牛程序员帮忙"); //周二,三,四的代码都是请求大牛程序员帮忙,可以利用穿透性简化代码
break;
case "周五":
System.out.println("今晚吃鸡");
break;
case "周六":
case "周日":
System.out.println("与王婆介绍的小芳相亲");
break;
default:
System.out.println("您输入的星期信息肯定是不存在的~~");
}
}
}
1.2 循环语句
1.2.1 FOR循环
- 控制一段代码反复执行很多次
for循环格式:
for 循环案例详细流程说明:
for 循环代码详细流程演示:
public class ForDemo {
public static void main(String[] args) {
// 目标:需要同学们掌握for循环的书写格式,并理解其执行流程
// 需求:打印多行Hello World
/**
流程:
首先会执行初始化语句:int i=0:
i = 0,判断循环条件 0 < 3,返回true,计算机会进入到循环中执行输出第一行Hello World,接着执行迭代语句i++
i = 1,判断循环条件 1 < 3,返回true,计算机会进入到循环中执行输出第二行Hello World,接着执行迭代语句i++
i = 2,判断循环条件 2 < 3,返回true,计算机会进入到循环中执行输出第三行Hello World,接着执行迭代语句i++
i = 3,判断循环条件 3 < 3,返回false,循环就会立即结束。
*/
for(int i=0; i<3; i++) {
//i = 0 1 2
System.out.println("Hello World");
}
}
}
Hello World
Hello World
Hello World
for循环在开发中的常见应用场景
- 减少代码的重复编写、灵活的控制程序的执行
public class ForDemo2 {
public static void main(String[] args) {
// 目标:掌握使用for循环批量产生数据
// 1、定义一个循环批量产生1-100这几个数
for (int i = 0; i < 100; i++) {
System.out.println(i);
}
// 2、定义一个变量用于求和
int sum = 0;
for (int i = 0; i <= 100; i++) { // 定义一个循环,先产生1-100,这100个数
//i = 0 1 2 3 4 5
sum = sum + i; //sum += i;
}
System.out.println("1-100数据的和:" + sum);
//3、定义一个变量用于求奇数和
int sum1 =0;
for (int i = 0; i <= 100; i+=2) { // 定义一个循环,先产生1-100中所有的奇数
sum1 += i;
}
System.out.println("1-100数据的奇数和:" + sum1);
//4、定义一个变量用于求奇数和
int sum2 =0;
for (int i = 0; i <= 100; i++) {
if (i % 2 == 1){
sum2 += i;
}
}
System.out.println("1-100数据的奇数和:" + sum2);
//5、定义一个变量用于求偶数和
int sum3 =0;
for (int i = 0; i <= 100; i++) {
if (i % 2 == 0){
sum3 += i;
}
}
System.out.println("1-100数据的偶数和:" + sum3);
}
}
1.2.2 while循环
- 控制一段代码反复执行很多次
while循环格式:
while 循环案例详细流程说明:
while 循环代码详细流程演示:
public class WhileDemo {
public static void main(String[] args) {
// 目标:掌握while循环的书写格式,以及理解其执行流程。
// 需求:打印多行Hello World
int i= 0;
while(i < 5){
//i = 0 1 2 3 4
System.out.println("Hello World");
i++;
}
}
}
while和for有什么区别?什么时候用for,什么时候用while?:
- 功能上是完全一样的,for能解决的while也能解决,反之亦然。
- 使用规范:知道循环几次:
使用for
不知道循环几次建议:使用while
1.2.3 使用while循环还是for循环案例
1.2.3.1 使用while循环(推荐)
public class WhileTest {
public static void main(String[] args) {
// 目标:使用while循环解决问题,并理解什么情况下使用while,for。
//1、定义变量记住珠穆朗玛峰的高度和纸张的高度。
double peakHeight=8848860;
double paperThickness =0.1;
// 3、定义一个变量count用于记住纸张折叠了多少次
int count =0;
//2、定义while循环控制纸张开始折叠
while(paperThickness < peakHeight) {
// 把纸张进行折叠,把纸张的厚度变成原来的2倍
paperThickness = paperThickness * 2;
count++;
}
System.out.println("需要折叠多少次:"+ count);
System.out.println("最终纸张的度是:"+ paperThickness);
}
}
需要折叠多少次:27
最终纸张的度是:1.34217728E7
1.2.3.2 使用for循环
public class WhileTest {
public static void main(String[] args) {
// 目标:使用while循环解决问题,并理解什么情况下使用while,for。
//1、定义变量记住珠穆朗玛峰的高度和纸张的高度。
double peakHeight=8848860;
double paperThickness =0.1;
// 3、定义一个变量count用于记住纸张折叠了多少次
int count =0;
//2、定义while循环控制纸张开始折叠
for(;paperThickness < peakHeight;count++) {
// 把纸张进行折叠,把纸张的厚度变成原来的2倍
paperThickness = paperThickness * 2;
}
System.out.println("需要折叠多少次:"+ count);
System.out.println("最终纸张的度是:"+ paperThickness);
}
}
需要折叠多少次:27
最终纸张的度是:1.34217728E7
1.2.4 do-while循环
- 控制一段代码反复执行很多次
do-while循环格式:先执行后判断
public class DoWhileDemo {
public static void main(String[] args) {
// 目标:掌握do-while循环的书写格式,执行流程,特点和应用场景。
// 需求:打印多行Hello World
int i = 0;
do {
System.out.println("Hello World");
i++;
} while (i < 3);
// 特点:先执行后判断
do {
System.out.println("Hello World2");
} while (false);
}
}
1.2.5 三种循环区别
- for循环 和 while循环(先判断后执行),do…while(先执行后判断)
- for循环 和 while循环的执行流程是一模一样的,功能上无区别,for能做的while也能做,反之亦然
- 使用规范:如果已知循环次数建议使用for循环,如果不清楚要循环多少次建议使用while循环
- 其他区别:for循环中,控制循环的变量只在循环中使用。while循环中,控制循环的变量在循环后还可以继续使用
public class DoWhileDemo {
public static void main(String[] args) {
for(int j=0;j<3;j++) {
System.out.println("Hello World3");
}
// System.out.println(j);
for(int j=0;j<3;j++){
System.out.println("Hello World3");
}
int m=0;
while(m < 3) {
System.out.println("Hello World4");
m++;
}
System.out.println(m); // 3
}
}
1.2.5 死循环
- 可以一直执行下去的一种循环,如果没有干预不会停下来
1.2.5.1 for死循环
public class EndLessLoopDemo {
public static void main(String[] args) {
// 目标:掌握死循环的写法。
for (;;){
System.out.println("Hello World1");
}
}
}
1.2.5.2 while死循环 (经典写法推荐)
public class EndLessLoopDemo {
public static void main(String[] args) {
// 目标:掌握死循环的写法。
while (true){
System.out.println("Hello World2");
}
}
}
1.2.5.3 do-while死循环
public class EndLessLoopDemo {
public static void main(String[] args) {
// 目标:掌握死循环的写法。
do {
System.out.println("Hello World3");
} while(true);
}
}
1.2.6 循环嵌套
- 外部循环每循环一次,内部循环会全部执行完一轮
public class LoopNestedDemo7 {
public static void main(String[] args) {
// 目标:搞清楚循环嵌套的执行流程。
// 场景:假如你有老婆,你犯错了,你老婆罚你说:3天,每天5句我爱你。
for(int i=1; i<= 3; i++) {
//i=1 2 3
for (int j = 1; j <= 5; j++) {
System.out.println("我爱你:" + i);
}
System.out.println("--------------");
}
/**
****
****
****
*/
for(int i=1; i<= 3; i++){
//i=1 2 3
// 定义一个循环控制每行打印多少列星星
for(int j=1;j<= 4;j++){
System.out.print("*");// 不换行
}
System.out.println();//换行
}
}
}
1.2.7 break和continue
终止循环:
- break:跳出并结束当前所在循环的执行
- continue:用于跳出当前循环的当次执行,直接进入循环的下一次执行
public class BreakAndContinueDemo8 {
public static void main(String[] args) {
// 目标:掌握break和continue的作用
// 1、break:跳出并结束当前所在循环的执行。
// 场景:假如你又有老婆了,你犯错了,你老婆罚你说:5句我爱你
// 说到第三句的时候心软了,让你别再说了。
for (int i = 1; i <= 5; i++) {
System.out.println("我爱你:" + i);
if (i == 3) {
// 说明已经说完了第三句了,心软了。
break;//跳出并结束当前所在循环的执行。
}
}
// 2、continue:跳出当前循环的当次执行,直接进入循环的下一次执行。
// 场景:假如你有老婆,你犯错了,你老婆罚你洗碗5天。
// 第三天的时候,你表现很好,第三天不用洗碗,但是不解恨,第四天还是要继续的。
for (int i = 1; i <= 5; i++) {
if (i == 3) {
// 已经到了第三天,第三天不用洗的。
continue;
}
System.out.println("洗碗:" + i);
}
}
}
1.3 案例演示
1.3.1 Random随机数
- 作用:生成随机数
import java.util.Random;
public class RandomDemo {
public static void main(String[] args) {
Random r = new Random();
int number = r.nextInt(10);
System.out.println("随机生成了:"+number);
}
}
注意:
- nextInt(n)功能只能生成:0至n-1之间的随机数,不包含n。
1.3.2 Random生成指定区间随机数
-
例如:要生成 1-10之间的随机数,程序怎么实现?
-
技巧:减加法
package com.qianxin.loop;
import java.util.Random;
public class RandomDemo {
public static void main(String[] args) {
Random r = new Random();
int number = r.nextInt(10);
System.out.println("随机生成了:" + number);
System.out.println("-------------------------------");
for (int i = 1; i <= 20; i++) {
//生成:1-10之间的随机数
// 1-10=>-1=>(0-9)+ 1
int data2 = r.nextInt(10) + 1;
System.out.println(data2);
}
System.out.println("-------------------------------");
for (int i = 1; i <= 100; i++) {
//3-17=>-3 =>(0-14)+ 3
int data3 = r.nextInt(15) + 3;
System.out.println(data3);
}
}
}
1.3.2.1 猜数字游戏
import java.util.Random;
import java.util.Scanner;
public class RandomTest {
public static void main(String[] args) {
Random r = new Random();
int number = r.nextInt(100) + 1;
Scanner sc = new Scanner(System.in);
while(true){
System.out.println("请猜一下我写的数是多少:");
int num = sc.nextInt();
if (num > number){
System.out.println("猜的有点大了!");
} else if (num < number) {
System.out.println("猜的有点小了");
}else {
System.out.println("猜对了");
break;
}
}
}
}