[面试原题]
Java中&与&&运算符的区别。
[正确答案]
&&是逻辑与运算符,运算的两个数据都是true时,结果为true,有一个数据是false,结果就是false。有短路效果。
&是与位运算符,运算的两个数据以二进制方式相同位与运算,两个都是1结果为1,有一个是0结果就是0。
&也可以用来处理逻辑与运算,运算结果和&&运算符相同。区别在于&运算不会造成短路效果。
[面试技术点]
Java逻辑运算符的短路效果。
[步骤解读一]
逻辑运算符&&和||的常规使用相信大家都没有疑问,这里小博老师就不浪费篇幅啦,以下图为结论。
这里重点为大家讲解一下逻辑运算符的短路效果。&&和||逻辑运算符,都是存在短路效果的。短路效果指的是,当运算符左边的值,对整个表达式起决定性因素时,运算符右边的表达式就不会(没必要)运行了。我们以&&运算符为例。
// 博为峰 BWF全栈Java课程
// JavaSE课程模块
// 运算符章节 ->逻辑运算符短路效果
int a = 3,b=5;
boolean c = a++ > 10 && b++ >10;
System.out.println("a = "+a+" , b = "+b+" , c = "+c );
运行结果是:a = 4 , b = 5 , c = false
a的值是4,因为运行了a++,大家应该没有问题。c的值是false,因为a++>10的值是false,b++>10的值也是false,大家应该也没有问题。那么关键就是b的值,为什么还是5?这是因为a++>10的值是false,&&逻辑运算符的两个运算值,只要有一个是false,结果就是false,因此&&运算符右边的b++>10表达式运算的结果是true还是false,已经没有任何意义了,对整个表达式的结果不起任何作用,因此&&运算符触发短路效果,直接不运行右边的表达式了。
[步骤解读二]
逻辑运算符的短路效果,其作用不光是为了提高程序的执行效率,过滤掉无用的表达式,其实在实际工作中有很重要的运用。比如,我们要判断某个学生对象是否年满18岁。
// 博为峰 BWF全栈Java课程
// JavaSE课程模块
// 运算符章节 ->逻辑运算符短路效果
class Student{
private Stringname;
private int age;
public Student(Stringname,intage){
this.name =name;
this.age =age;
}
}
Student s = null;
if(s.age >= 18){
System.out.println(s.name+"成年啦!");
}
运行结果:NullPointerException空指针异常,因为学生对象s是null。
如果我们的要求是,当学生存在并且年满18岁时,输出该学生成年。当学生不存在或则年龄不满18岁时,不输出。我们可以改变一下判断的条件。、
原判断条件:if( s.age >= 18 )
现判断条件:if(s!= null&&s.age >= 18 )
这样改写判断条件后,无论学生对象是否存在,都不会再出现空指针异常。这是因为,如果学生对象是null时,s!=null的值为false,&&运算符触发了短路效果,s.age>=18表达式就不会运行了,也就不会访问到空指针对象s中的成员(age)了。
[步骤解读三]
&运算符的位运算作用,相信大家并不陌生,也不是本篇的重点,小博老师这里就不浪费篇幅了。这里主要给大家演示&运算符的逻辑运算时,和&&运算符的区别。同样的案例如下:
// 博为峰 BWF全栈Java课程
// JavaSE课程模块
// 运算符章节 ->逻辑运算符短路效果
int a = 3,b=5;
boolean c = a++ > 10 & b++ > 10;
System.out.println("a = "+a+" , b = "+b+" , c = "+c );
运算结果:a = 4 , b = 6 , c = false
由此可见,&&运算符和&运算符的逻辑运算结果相同,区别在于&&运算符有短路效果,而&运算符是没有短路效果的,无论运算符左边的值是什么,运算符右边的表达式都要运行。