小博老师解析经典Java面试题-&与&&运算符

来源:互联网 发布:苏州网络约车最新办法 编辑:程序博客网 时间:2024/06/05 02:55

[面试原题]

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

由此可见,&&运算符和&运算符的逻辑运算结果相同,区别在于&&运算符有短路效果,而&运算符是没有短路效果的,无论运算符左边的值是什么,运算符右边的表达式都要运行。

 


0 0
原创粉丝点击