HI,大家好,我是Lee
上一篇我们说了java中的数据类型,这篇文章说一下java中的流程控制,也就是循环和判断,流程控制是必须需要掌握的,在工作中用到的地方有很多,好了,话不多说 让我们开始吧。
一、判断
判断
在java中,如果决定是否要执行一段代码,就需要if语句
if语句
if(条件){
条件满足时执行
}
根据if条件的执行结果,判断是true还是false,JVM决定是否要执行if语句块
例:
int a = 20;
if(a == 20){
System.out.println("执行这段代码");
}
根据if条件判断 a == 20 为true,所以执行if语句块,执行结果为 输出 a等于20
当if语句块只有一个语句时,可以省略花括号{},使用缩进的方式,但是不建议,如果再想再if语句块中增加代码 还需要增加花括号
int a = 20;
if (a == 20)
System.out.println("执行这段代码");
else语句
if语句后还可以编写一个else语句块,当if条件判断为false时,执行else语句块
int a = 20;
if (a == 10){
System.out.println("执行if语句块");
}else {
System.out.println("执行else语句块");
}
执行上述代码,输出结果为 执行else语句块
else语句块不是必须的
还可以用多个 else if串联
if (a == 10){
System.out.println("执行if语句块");
}else if (a == 15){
System.out.println("执行else if语句块-1");
}else if (a == 20){
System.out.println("执行else if语句块-2");
}else {
System.out.println("执行else语句块");
}
注意:使用else if串联时要注意判断顺序
int data = 80;
if (data > 10){
System.out.println("大于10");
}else if (data > 50){
System.out.println("大于50");
}else if (data > 80){
System.out.println("大于80");
}else {
System.out.println("小于等于10");
}
执行上述代码 期望输出 大于50 ,但是实际却输出 大于10 ,因为使用else if串联时,在有一个条件满足时,不会往下执行其他的else if语句
else if 相当于
if (data > 10){
System.out.println("大于10");
}else {
if (data > 50){
System.out.println("大于50");
}
}
正确的方式应该更改条件
int data = 80;
if (data > 10 && data <= 50){
System.out.println("大于10");
}else if (data > 50 && data <= 80){
System.out.println("大于50");
}else if (data > 80){
System.out.println("大于80");
}else {
System.out.println("小于等于10");
}
判断引用类型
在java判断值类型的变量相等时,使用 == ,但是判断引用类型变量则需要使用 equals
//我们首先来看使用 == 判断
//首先创建一个学生类
public class Student {
private String name;
private Integer age;
}
//创建两个学生对象
Student stu1 = new Student("Lee", 18);
Student stu2 = new Student("Lee", 18);
if (stu1 == stu2){
System.out.println("相等");
}else {
System.out.println("不相等");
}
//结果为不想等
//因为 == 比较的是地址值,两个对象虽然值是一样的,但是地址值是不用的 地址值例:com.example.test.Student@241767
//我们再来看使用equals判断
//使用equals首先学生类中要重写equals方法
public class Student {
private String name;
private Integer age;
//重写equals方法
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Student student = (Student) o;
return Objects.equals(name, student.name) &&
Objects.equals(age, student.age);
}
}
//在进行判断
if (stu1.equals(stu2)){
System.out.println("相等");
}else {
System.out.println("不想等");
}
//结果为相等 因为 使用equals方法时比较的是两个对象的值而不是地址值
switch多重判断
除了if语句之外,还有另一个判断语句,是根据某个表达式的结果,分别去执行不同的分支
int a = 1;
switch (a){
case 1:
System.out.println("执行选择1");
case 2:
System.out.println("执行选择2");
case 3:
System.out.println("执行选择3");
}
//执行结果:
//执行选择1
//执行选择2
//执行选择3
//可以发现,a = 1,但是三个选项都输出了,这是因为缺少break中断语句,所以在执行完 case 1后会继续往下执行
switch (a){
case 1:
System.out.println("执行选择1");
break;
case 2:
System.out.println("执行选择2");
break;
case 3:
System.out.println("执行选择3");
break;
}
//执行结果:
//执行选择1
//现在可以看到 只有case 1被执行
当使用switch语句时,条件没有任何一个case进行匹配时,就需要使用default语句
int a = 20;
switch (a) {
case 1:
System.out.println("执行选择1");
break;
case 2:
System.out.println("执行选择2");
break;
case 3:
System.out.println("执行选择3");
break;
default:
System.out.println("没有任何匹配");
break;
}
//只要a不是1、2、3 就会进入default语句块中
注意:
使用switch语句注意case语句没有花括号,且case具有穿透性,千万不要漏写 break;
switch语句不仅可以判断整数,字符串和枚举都是可以进行判断的
case不需要顺序写,只要有break语句,可以任意顺序写
在java12中升级了 更简洁的switch 语法表达式使用类似模式匹配(Pattern Matching)的方法,保证只有一种路径会被执行,并且不需要break语句
public class Main {
public static void main(String[] args) {
String fruit = "apple";
switch (fruit) {
case "apple" -> System.out.println("Selected apple");
case "pear" -> System.out.println("Selected pear");
case "mango" -> {
System.out.println("Selected mango");
System.out.println("Good choice!");
}
default -> System.out.println("No fruit selected");
}
}
}
注意新语法使用->,如果有多条语句,需要用{}括起来。不要写break语句,因为新语法只会执行匹配的语句,没有穿透效应。
二、循环
循环语句就是让计算机根据条件做循环计算,在条件满足时继续循环,条件不满足时退出循环。java中有三种循环(while、do while、for)
while循环
while循环的基本用法
while (条件表达式) {
循环语句
}
while循环是先判断后循环,首先判断表达式是否成立 如果为true则继续执行循环,如果为false,则跳出循环
我们使用while循环计算1到100的和
int x = 1;
int sum = 0;
while (x <= 100) {
sum += x;
x++;
}
System.out.println("1-100的和等于" + sum);
注意循环内自增变量的位置,如果 x++ 在 sum+=x 之前,那结果就完全不正确了
要注意表达式如果一直为true时,那循环就变成了死循环,一直执行循环内的语句,会占用电脑的cpu,造成电脑卡顿
异常退出逻辑
byte x = 1;
while (x > 0){
x++;
}
System.out.println(x);
可以看到上述代码,定义了一个字节类型的x,x初始值为1,循环条件是x大于0,循环内x一直自增1,但是循环到第128次还是会退出循环,因为byte类型最大值为127 ,到最大值在自增1的话会变成负数(-128)则条件判断为false,退出循环
do while循环
do while基本用法
do {
循环语句
}while (条件表达式);
while循环是先判断,后循环,而do while循环则相反,先循环后判断,这就导致了不管条件是否为true,都会执行一次循环
使用do while循环计算1到100的和
int x = 0;
int sum = 0;
do {
sum += x;
x++;
}while (x <= 100);
System.out.println(sum);
使用do while循环要注意条件的判断 以及 语句内自增变量的位置
for循环
for循环的基本用法
for (初始条件; 循环检测条件; 循环后更新计数器) {
循环语句
}
在java中 使用 最广泛的就是for循环
for循环的功能非常强大,它使用计数器实现循环。for循环会先初始化计数器,然后,在每次循环前检测循环条件,在每次循环后更新计数器。计数器变量通常命名为i
使用for循环计算1到100的和
int sum = 0;
for (int i = 0; i <= 100; i++) {
sum += i;
}
System.out.println(sum);
在for循环执行前,会先执行初始化语句int i=1,它定义了计数器变量i并赋初始值为1,然后,循环前先检查循环条件i<=100,循环后自动执行i++,因此,和while循环相比,for循环把更新计数器的代码统一放到了一起。在for循环的循环体内部,不需要去更新变量i。
循环中止(break、continue)
无论是那种循环 都可以使用break跳出循环以及continue进行下一次循环
首先,我们看一下break,使用for循环跳出
int sum = 0;
for (int i = 0; i <= 100; i++) {
if (i == 50){
break;
}
sum += i;
}
System.out.println(sum);
上述代码结果sum为 1225,因为当i自增到50时遇到判断,进行了break的操作,跳出了循环,所以直接循环结束,break都是搭配if来使用
注意 break时跳出本层循环,如果是多层循环,break只可以跳出当前一层的循环
我们再看下continue,使用for循环进行下一次循环
int sum = 0;
for (int i = 0; i <= 100; i++) {
if (i == 50){
continue;
}
sum += i;
}
System.out.println(sum);
上述代码结果sum为5000,因为在循环内有一个判断 在 i 等于50时,进行了一个continue的操作,循环执行时遇到 continue 会直接进行下一次循环,代表本次循环结束
关于java的循环和判断就说到这里啦,有什么想讨论的可以公众号私聊我!
公众号:测试开发Lee