逻辑运算符、位运算符、流程控制、循环
java 核心基础 2.26
逻辑运算符(四种)
只能用于 boolean 类型的数据运算,判断 boolean 数据之间的逻辑关系,包括与、或、非 3 种关系
运算符包括 &(与)、|(或)、&&(短路与)、||(短路或)、!(非)
- A & B:只有当 A 和 B 都为 true,结果为 true,否则为 false
- A | B:当 A 或者 B 有一个为 true,结果为 true,否则为 false
- A && B:只有当 A 和 B 都为 true,结果为 true,否则为 false
- A || B:当 A 或者 B 有一个为 true,结果为 true,否则为 false
- ! A:如果 A 为 true,结果为 false
运算效率短路与和短路非效率更高
&运算需要先判断A的值,然后再判断B的值
而&&运算先判断A的值,如果A的值为false,则无需继续判断,则 A && B 为false
&运算
public class Test {
public static void main(String[] args) {
int num1 = 10;
int num2 = 11;
System.out.println((num1++ == num2) & (++num1 == num2)));
System.out.println(num1);
}
}
输入结果:
flase
12
&&运算
public class Test {
public static void main(String[] args) {
int num1 = 10;
int num2 = 11;
System.out.println((num1++ == num2) && (++num1 == num2));
System.out.println(num1);
}
}
输入结果:
false
11
可以看见num1只加了一次 1,在判断(num1++ == num2)的为false的时候就终止了
位运算符
位运算指的是对表达式以二进制为单位进行的运算
位运算符包含 &(按位与)、|(按位或)、^(按位异或)、<<(左移)、>>(右移)
- A & B:每一位数字一一对应,若都为 1,该位记作 1,否则为 0
- A | B:每一位数字一一对应,只要有一个为 1,该位记作 1,否则为 0
- A ^ B:每一位数字一一对应,相同记作 0,不同记作 1
- A << B:A 乘以 2 的 B 次方,2 << 3
- A >> B:A 除以 2 的 B 次方,2 >> 3
10 & 5 = 0 (1010 & 0101) =0000
10 | 5 = 15 (1010 | 0101) =1111
10 ^ 3 = 9 (1010 ^ 0011) =1001
2 << 3 = 16
2 >> 3 = 0
public class Test {
public static void main(String[] args) {
System.out.println("按位与 & ");
System.out.println(10001 & 10101);
System.out.println("按位或 | ");
System.out.println(10001 | 10101);
System.out.println("按位异或 ^ ");
System.out.println(10001 ^ 10101);
System.out.println("左移(乘以2的几次方) << ");
System.out.println(2 << 3);
System.out.println("右移(除以2的几次方) >> ");
System.out.println(16 >> 2);
}
}
输出结果:
流程控制
switch-case 只能完成等值判断,switch 支持的数据类型 int、short、byte、枚举、String,不支持 boolean
switch(变量){
case 值1:
代码1;
break;
case 值2:
代码2;
break;
case 值3:
代码3;
break;
}
if(变量 == 值1){
代码1;
} else if(变量 == 值2){
代码2;
} else if(变量 == 值3){
代码3;
}
if语句:
int placing = 2;
if(placing == 1){
System.out.println("奖励2000元");
} else if(placing == 2){
System.out.println("奖励1000元");
} else if(placing == 3){
System.out.println("奖励500元");
} else {
System.out.println("没有奖励");
}
switch语句:
int placing = 2;
switch (placing){
case 1:
System.out.println("奖励2000元");
break;
case 2:
System.out.println("奖励1000元");
break;
case 3:
System.out.println("奖励500元");
break;
default:
System.out.println("没有奖励");
}
这两个输入的相同,但是swicth结构更加清晰
注意:switch - case的时候需要记住一定要加上break,不然逻辑会混乱,不会在选取到满足条件的语句之后进行中断
原因:在switch语句中,每个case分支后如果没有break,程序将继续执行后续的case和default块,直到遇到break或switch结构结束
例如:
int placing = 2;
switch (placing){
case 1:
System.out.println("奖励2000元");
case 2:
System.out.println("奖励1000元");
case 3:
System.out.println("奖励500元");
default:
System.out.println("没有奖励");
}
就会输出:
循环
for,while,do-while,foreach
循环四要素
- 初始化循环变量
- 循环条件
- 循环体
- 更新循环变量
while 和 do-while 的区别
while是先判断再执行,do-while是先执行一次再判断
int i = 10;
while(i < 10){
System.out.println(i);
i++;
}
System.out.println("end");
do{
System.out.println(i);
}while (i < 10);
可以看见第一个while没有执行
但是do-while执行了
输出结果:
foreach针对集合的遍历更加简便
public static void main(String[] args) {
ArrayList<Object> objects = new ArrayList<>();
objects.add("1");
objects.add("2");
objects.add("3");
System.out.println("for-i循环");
for (int i = 0; i < objects.size(); i++) {
System.out.println(objects.get(i));
}
System.out.println("foreach循环");
for (Object object : objects) {
System.out.println(object);
}
}
双重循环
一个循环的循环体是另外一个循环
public static void main(String[] args) {
for (int i = 0; i < 5; i++) {
for (int j = 0; j < 5; j++){
System.out.println(i+" "+j);
}
}
}
终止循环
break; 跳出整个循环
continue; 跳出本次循环,继续执行下一次循环
public static void main(String[] args) {
int sum = 0;
for (int i = 1; i < 200; i++){
if( i % 2 == 0)
break;
sum++;
}
System.out.println("break");
System.out.println(sum);
int sum2 = 0;
for (int i = 1; i < 200; i++){
if( i % 2 == 0)
continue;
sum2++;
}
System.out.println("continue");
System.out.println(sum2);
}
输出结果: