高薪程序员&面试题精讲系列30之说一下&与&&的区别

一. 面试题及剖析

1. 今日面试题

一下&与&&运算符的区别?

说一下|与||运算符的区别?

2. 题目剖析

壹哥 今天给大家讲解的面试题,可以说很简单了。这道题主要就是考察我们对Java中各运算符的掌握情况,另外顺带着会考察出我们对计算机的二进制,以及进制间转换的掌握情况。这道题如果你能够答出来比较深层次的东西,会让面试官觉得你追求代码性能,所以越是这种看似基础简单的题目,越能考察出我们的基本功。

二. 参考答案

接下来 壹哥 就给大家说一下这道题目的常规答案。

1. &和&&的区别

  • &和&&都可以进行 “与运算”,它们都是“逻辑与(and)”,但 &一般称作 “按位与”,&& 称作 “短路与”。当运算符两边的表达式的结果都为true时,整个运算结果才为true,否则只要一方为false,则结果为false。
  • &&运算符被称为短路与,具有短路的功能。也就是说,如果&&左边的表达式值为false,则右边的表达式会被直接短路掉,根本不会参与运算,所以&&相对于&符号来说,性能更高一些。比如我们在用户登录时,要判定用户名不是null而且不是空字符串,代码可以这么写:username != null &&!username.equals(“”)。这里用的就是&&,而不是&,而且&&前后两边表达式的顺序不能交换。这是因为如果第一个条件不成立,根本就不能进行字符串的equals()比较,否则会产生NullPointerException异常。
  • 另外&可以做位运算当表达式两边不是boolean类型时,&用于进行位运算。

所以总的来说,& 可以进行逻辑运算,也可以进行位运算;但是 && 只能进行逻辑运算。

2. | 和 || 的区别

接下来我再顺带着说一下 | 和 || 的区别。

  • | 和 || 都可以进行 “或运算”,它们都是“逻辑或(or)”,但 | 一般称为“按位或”,|| 称为“短路或”。运算符两边表达式的结果,其中一个为true时,整个运算的结果就为true。
  • || 运算符被称为短路或,具有短路的功能。也就是说,如果 || 左边的表达式值为true,则右边的表达式会被直接短路掉,不用再参与或运算,所以 || 的效率也比较高一些。
  • 另外 | 可以做位运算。当表达式两边不是boolean类型时,| 用于进行位运算。

所以总的来说,| 可以进行逻辑运算,也可以进行位运算;但是 || 只能进行逻辑运算。

3. 位运算

我们在给面试官回答这个题目的时候,肯定会提到位运算,有些面试官就会顺着你说的位运算进行提问,所以这里 壹哥 带各位把位运算也顺带着复习一下。

3.1 常用的位运算符如下:

3.2 按位与运算案例

当两个整数进行按位与运算时,如果对应的位都是1,则为1;否则,结果为0;如果参与运算的两个数精度不同,则结果会被转换为精度较高的数据类型。以下是我简单给出的2个按位与的案例,各位可以参考。

1&2的运算过程:

整数 1 的二进制表示为: 00000000 00000000 00000000 00000001

整数 2 的二进制表示为: 00000000 00000000 00000000 00000010

按位与运算的结果为 0 :00000000 00000000 00000000 00000000

3&6的运算过程:

整数 3 的二进制表示为: 00000000 00000000 00000000 00000011

整数 6 的二进制表示为: 00000000 00000000 00000000 00000110

按位与运算的结果为 2 : 00000000 00000000 00000000 00000010

三. 结语

今天的面试题很简单,我们稍作记忆就可以了。但是 壹哥 希望各位在回答这道题目的时候,不仅可以把&和&&的区别说出来,还可以拓展说出 Java中的运算符、位运算、二进制、进制转换等相关的内容如果你的答案中能够把这些内容也都有所涵盖,那么面试官会认为你的基础比较扎实,得分会更高。

最后给大家留个思考问题,看你是否可以回答出来,请在评论区留言说出你的答案哦。

int x=5;

if(x==10 & ++y>0){...},请说出这个判断中执行后y的值。

if(x==20 && ++y>0),请说出这个判断中执行后y的值。