高薪程序员&面试题精讲系列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的值。