短路逻辑运算符用于处理布尔类型的值,即真(true)和假(false)。
Java提供了2种短路逻辑运算符
- 与(&&)
- 或(||)
它们在控制流程、条件判断以及逻辑表达式中发挥着核心作用。本文将逐一介绍这些逻辑运算符,并通过典型例子展示其应用场景。
1. 短路与(&&)
与运算符(&&)用于连接两个布尔表达式,只有当两边的表达式都为真时,结果才为真。
// 短路与
System.out.println("true && true 的结果:" + (true && true));
System.out.println("true && false 的结果:" + (true && false));
System.out.println("false && true 的结果:" + (false && true));
System.out.println("false && false 的结果:" + (false && false));
逻辑与运算符两边的表达式可以是boolean类型的变量:
boolean isValidUsername = true;
boolean isValidPassword = false;
System.out.println("isValidUsername && isValidPassword 的结果:" + (isValidUsername && isValidPassword));
也可以是结果为boolean类型的表达式:
boolean isAllValid = (7 > 3) && (4 < 5);
或者
boolean isAllValid = compare(7,3) && compare(5,4);
public boolean compare(int num1, int num2) {
return num1 > num2;
}
逻辑与遵循短路原则,即如果左边的表达式为假,则不会继续评估右边的表达式,因为无论右边结果如何,整体结果都已经确定为假。
public static void main(String[] args) {
// 演示短路与,&&运算符两边是函数调用
System.out.println("短路与演示:isGreat1 && isGreat2 :" + (isGreate(3,7) && isGreate(7,3)) );
}
private static boolean isGreate(int num1, int num2) {
System.out.println(String.format("判断num1:【%d】 是否大于【num2】:%d", num1, num2));
return num1 > num2;
}
如上所示,逻辑与运算符左边的表达式返回结果为false,则右边的表达式不会被执行,因为此时已经可以判断逻辑与运算结果为false,无需继续计算右边表达式的结果。
交换上面代码逻辑与运算符左右两边的表达式,使得短路与运算符左边的表达式结果为ture。如下图,虽然最终整个表达式结果仍然是false,但是左右两边的表达式都有执行:
场景示例
考虑用户登录验证的场景,我们需要检查用户名和密码是否同时有效:
boolean isValidUsername = checkUsername(username);
boolean isValidPassword = checkPassword(password);
if (isValidUsername && isValidPassword) {
System.out.println("登录成功!");
} else {
System.out.println("用户名或密码错误。");
}
在这个例子中,&&
运算符确保了只有当isValidUsername
和isValidPassword
均为true
时,才会输出“登录成功!”的消息,否则直接提示错误信息,避免了不必要的密码验证。
2. 短路或(||)
或运算符(||)用于连接两个布尔表达式,只要两边的表达式中有一个为真,结果就为真。
// 短路或
System.out.println("true || true 的结果:" + (true || true));
System.out.println("true || false 的结果:" + (true || false));
System.out.println("false || true 的结果:" + (false || true));
System.out.println("false || false 的结果:" + (false || false));
同样遵循短路原则,若左边表达式为真,则不会继续评估右边表达式。
因为短路与运算符左侧的表达式结果为true,整个表达式的结果肯定为true,无需继续判断右侧表达式的结果,所以上图中只有一次函数调用的日志。
如果逻辑与运算符左边表达式的结果为false呢?
如下图所示,这种情况下,就不会出现短路现象,两边的表达式都会执行。
场景示例
去女朋友家见丈母娘,丈母娘说:“必须有车或者房子,否则趁早分手”:
boolean hasCar= boyFriend.hasCar();
boolean hasHouse= boyFriend.hasHouse();
if (hasCar|| hasHouse) {
System.out.println("叫妈吧,好女婿。");
} else {
System.out.println("没门,你以为你是郭有才啊。");
}
此例中,只要男朋友有车(hasCar
)或者有房(hasHouse
),丈母娘就同意。
总结
- 都是双目运算符
- 都有短路效果