欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java中短路運算符與邏輯運算符示例詳解

 更新時間:2021年01月12日 11:18:26   作者:技術企鵝  
這篇文章主要給大家介紹了關于Java中短路運算符與邏輯運算符的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

1、邏輯運算符(部分)

符號 名稱
&& 短路與運算符
|| 短路或運算符
& 與運算符
| 或運算符

對于理工科學習者來說,邏輯運算是較為基礎的概念,通常會在大一的離散數(shù)學課程中有所了解。在Java以及更多C-Like語言中,&和|會分別表示邏輯運算中的與、或,他們的運算結果與我們在數(shù)學書中所學的邏輯運算規(guī)則并無差異。但是,在實際編程的過程中,我們反而會更多使用&&和||,甚至不少同學都不了解&、|兩個運算符。那么,這究竟是為什么呢?

2、短路運算符

讓我們來回到最初學習邏輯運算時解決問題的真值表,以“或運算”為例:

a b 結果
true true true
true false true
false true true
false false false

a和b中,只要至少有一個為true,最終輸出的結果則為true。那么,從算法優(yōu)化的角度來思考問題的話,我們?yōu)榱私?jīng)過最少步驟還能輸出可靠的結果,我們便可以把“或運算”定義為,有一個true,就輸出true。

由此,“或運算”可以被優(yōu)化為:從左向右,遇到有一個布爾表達式為true,則返回true,不進行之后的運算。

與之相似的,“與運算”可以被優(yōu)化為:從左向右,遇到有一個布爾表達式為false,則返回false,不進行之后的運算。

故此,短路運算符被設計了出來。但為了兼顧“執(zhí)行命令并返回”、“純粹的數(shù)學計算”等多種應用場景,傳統(tǒng)的非短路邏輯運算符也沒有被短路邏輯運算符而取代。

此外,對于連寫的短路運算符,如func1()||func2()||func3()||func4(),編譯器也會為此優(yōu)化,我們不妨來閱讀這一部分的字節(jié)碼來驗證這個結論:

public static void main(String[] args) {
  boolean b1 = func1() || func2() || func3() || func4();
  System.out.println("------------------");
  boolean b2 = func1() | func2() | func3() | func4();
}

// func1() - func4() here

短路“或”的字節(jié)碼如下:

0: invokestatic #7     // Method func1:()Z
3: ifne   24
6: invokestatic #13     // Method func2:()Z
9: ifne   24
12: invokestatic #16     // Method func3:()Z
15: ifne   24
18: invokestatic #19     // Method func4:()Z
21: ifeq   28
24: iconst_1
25: goto   29
28: iconst_0
29: istore_1

3行、9行、15行的ifne是將棧頂元素與0(false)相比,如果不為false則跳轉到24行將常量1(true)入棧,完成賦值,會跳過其余的執(zhí)行。直到最后21行,才將最后方法結果的值再與0相比,如果還是0,則將常量0入棧,完成賦值。

普通“或”等字節(jié)碼如下:

38: invokestatic #7     // Method func1:()Z
41: invokestatic #13     // Method func2:()Z
44: ior
45: invokestatic #16     // Method func3:()Z
48: ior
49: invokestatic #19     // Method func4:()Z
52: ior
53: istore_2

則是普通的或運算,無跳轉,順序執(zhí)行最后賦值。

3、應用與陷阱

在最起初,筆者重新認識短路運算符是在這樣一段代碼中:

public LoginCheckDTO XxxLoginCheck(String password) {
	//some codes
	if ( password == null || password.length() == 0 ) {
		return LoginCheckDTO.EMPTY_PASSWORD;
	}
	//some codes
}

當時筆者認為,如果password為null,在嘗試調用password.length()時,會拋出空指針異常,故此寫法不好。但在后來進行測試的時候,發(fā)現(xiàn)這樣寫并沒有問題,查閱相關資料便了解了短路運算符的概念。

在這個例子中,當執(zhí)行password == null返回true的時候,隨后的表達式將不會被執(zhí)行,就不存在拋出異常的情況了。這便是短路運算符較為常用的一個應用場景。

除此之外,我們還要警惕短路運算符導致的指令執(zhí)行不完整。

譬如如下應用場景,我們希望利用條件語句來判斷所有燈在上一狀態(tài)是否都開著,并且無論如何我們希望最后打開所有的燈。但是我們錯誤使用了短路運算符:

public boolean checkAndTurnOnAll() {
	return checkAndTurnOn1() && checkAndTurnOn2();
}

private boolean checkAndTurnOn1() {
	boolean check = check1();
	turnOn1();
	return check;
}

private boolean checkAndTurnOn2() {
	boolean check = check2();
	turnOn2();
	return check;
}

在這個場景中,如果第一盞燈在上一個狀態(tài)是關閉狀態(tài),在checkAndTurnOn1()中雖然會執(zhí)行turnOn1(),并且返回false,但由于短路特性checkAndTurnOn2()并不會被執(zhí)行,所以最后期望的看到所有的燈都被打開不一定會實現(xiàn)。這種情況應當使用&。

總結

到此這篇關于Java中短路運算符與邏輯運算符的文章就介紹到這了,更多相關Java短路運算符與邏輯運算符內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Java中synchronized正確使用方法解析

    Java中synchronized正確使用方法解析

    這篇文章主要介紹了Java中syncronized正確使用方法解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-09-09
  • Java多線程4種拒絕策略小結

    Java多線程4種拒絕策略小結

    當線程池中的任務隊列已滿且無法再接受新的任務時,就需要采取拒絕策略來處理這種情況,本文主要介紹了Java多線程拒絕策略,包含了四種常見的拒絕策略,具有一定的參考價值,感興趣的可以了解一下
    2024-03-03
  • JavaWeb使用mvc模式實現(xiàn)登錄功能

    JavaWeb使用mvc模式實現(xiàn)登錄功能

    本文主要介紹了JavaWeb使用mvc模式實現(xiàn)登錄功能,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • Java多線程用法的實例詳解

    Java多線程用法的實例詳解

    這篇文章主要介紹了Java多線程用法的實例詳解的相關資料,希望通過本文大家能夠理解掌握這部分內容,需要的朋友可以參考下
    2017-09-09
  • Spring boot項目集成Camel FTP的方法示例

    Spring boot項目集成Camel FTP的方法示例

    這篇文章主要介紹了Spring boot項目集成Camel FTP的方法示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-10-10
  • idea mac版打開是出現(xiàn)打開失敗問題及解決

    idea mac版打開是出現(xiàn)打開失敗問題及解決

    這篇文章主要介紹了idea mac版打開是出現(xiàn)打開失敗問題及解決方案,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • Java實現(xiàn)多個數(shù)組間的排列組合

    Java實現(xiàn)多個數(shù)組間的排列組合

    這篇文章主要為大家詳細介紹了Java實現(xiàn)多個數(shù)組間的排列組合,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-02-02
  • Java編程線程間通信與信號量代碼示例

    Java編程線程間通信與信號量代碼示例

    這篇文章主要介紹了Java編程線程間通信與信號量代碼示例,具有一定借鑒價值,需要的朋友可以參考下。
    2017-12-12
  • Struts2的配置文件方法小結

    Struts2的配置文件方法小結

    最近正在學習Struts2,在配置文件中遇到好多標簽,各種意義不同。下面這篇文章就來給大家介紹關于Struts2配置文件的相關資料,文中通過圖文介紹的非常詳細,需要的朋友們下面隨著小編來一起學習學習吧。
    2018-04-04
  • java jdk動態(tài)代理詳解

    java jdk動態(tài)代理詳解

    動態(tài)代理類的Class實例是怎么生成的呢,是通過ProxyGenerator類來生成動態(tài)代理類的class字節(jié)流,把它載入方法區(qū)
    2013-09-09

最新評論