[面试原题]面试
Java中&与&&运算符的区别。this
[正确答案]指针
&&是逻辑与运算符,运算的两个数据都是true时,结果为true,有一个数据是false,结果就是false。有短路效果。code
&是与位运算符,运算的两个数据以二进制方式相同位与运算,两个都是1结果为1,有一个是0结果就是0。对象
&也能够用来处理逻辑与运算,运算结果和&&运算符相同。区别在于&运算不会形成短路效果。get
[面试技术点]io
Java逻辑运算符的短路效果。class
[步骤解读一]效率
逻辑运算符&&和||的常规使用相信你们都没有疑问,这里小博老师就不浪费篇幅啦,如下图为结论。全栈
这里重点为你们讲解一下逻辑运算符的短路效果。&&和||逻辑运算符,都是存在短路效果的。短路效果指的是,当运算符左边的值,对整个表达式起决定性因素时,运算符右边的表达式就不会(不必)运行了。咱们以&&运算符为例。
// 博为峰 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 String name;
private int age;
public Student(String name,int age){
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
因而可知,&&运算符和&运算符的逻辑运算结果相同,区别在于&&运算符有短路效果,而&运算符是没有短路效果的,不管运算符左边的值是什么,运算符右边的表达式都要运行。