小博老師解析經典Java面試題-&與&&運算符

[面試原題]面試

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

因而可知,&&運算符和&運算符的邏輯運算結果相同,區別在於&&運算符有短路效果,而&運算符是沒有短路效果的,不管運算符左邊的值是什麼,運算符右邊的表達式都要運行。

相關文章
相關標籤/搜索