[面試原題]面試
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
因而可知,&&運算符和&運算符的邏輯運算結果相同,區別在於&&運算符有短路效果,而&運算符是沒有短路效果的,不管運算符左邊的值是什麼,運算符右邊的表達式都要運行。