亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Java中短路運(yùn)算符與邏輯運(yùn)算符示例詳解

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

1、邏輯運(yùn)算符(部分)

符號(hào) 名稱
&& 短路與運(yùn)算符
|| 短路或運(yùn)算符
& 與運(yùn)算符
| 或運(yùn)算符

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

2、短路運(yùn)算符

讓我們來回到最初學(xué)習(xí)邏輯運(yùn)算時(shí)解決問題的真值表,以“或運(yùn)算”為例:

a b 結(jié)果
true true true
true false true
false true true
false false false

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

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

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

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

此外,對(duì)于連寫的短路運(yùn)算符,如func1()||func2()||func3()||func4(),編譯器也會(huì)為此優(yōu)化,我們不妨來閱讀這一部分的字節(jié)碼來驗(yàn)證這個(gè)結(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則跳轉(zhuǎn)到24行將常量1(true)入棧,完成賦值,會(huì)跳過其余的執(zhí)行。直到最后21行,才將最后方法結(jié)果的值再與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

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

3、應(yīng)用與陷阱

在最起初,筆者重新認(rèn)識(shí)短路運(yùn)算符是在這樣一段代碼中:

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

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

在這個(gè)例子中,當(dāng)執(zhí)行password == null返回true的時(shí)候,隨后的表達(dá)式將不會(huì)被執(zhí)行,就不存在拋出異常的情況了。這便是短路運(yùn)算符較為常用的一個(gè)應(yīng)用場(chǎng)景。

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

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

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

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

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

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

總結(jié)

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

相關(guān)文章

  • Spring MVC通過添加自定義注解格式化數(shù)據(jù)的方法

    Spring MVC通過添加自定義注解格式化數(shù)據(jù)的方法

    這篇文章主要給大家介紹了關(guān)于Spring MVC通過添加自定義注解格式化數(shù)據(jù)的方法,文中先對(duì)springmvc 自定義注解 以及自定義注解的解析進(jìn)行了詳細(xì)的介紹,相信會(huì)對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-11-11
  • Mybatis 實(shí)現(xiàn)打印sql語句的代碼

    Mybatis 實(shí)現(xiàn)打印sql語句的代碼

    這篇文章主要介紹了Mybatis 實(shí)現(xiàn)打印sql語句的代碼,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-07-07
  • Java文件基本操作總結(jié)

    Java文件基本操作總結(jié)

    今天給大家?guī)淼氖顷P(guān)于Java基礎(chǔ)的相關(guān)知識(shí),文章圍繞著Java文件操作展開,文中有非常詳細(xì)的介紹及代碼示例,需要的朋友可以參考下
    2021-06-06
  • 簡(jiǎn)單易懂Java反射的setAccessible()方法

    簡(jiǎn)單易懂Java反射的setAccessible()方法

    本文主要介紹了簡(jiǎn)單易懂Java反射的setAccessible()方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-07-07
  • springboot中swagger快速啟動(dòng)流程

    springboot中swagger快速啟動(dòng)流程

    這篇文章主要介紹了springboot中的swagger快速啟動(dòng)流程,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-09-09
  • Spring請(qǐng)求路徑帶參數(shù)URL使用注解的寫法說明

    Spring請(qǐng)求路徑帶參數(shù)URL使用注解的寫法說明

    這篇文章主要介紹了Spring請(qǐng)求路徑帶參數(shù)URL使用注解的寫法說明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • Java基于drools做規(guī)則校驗(yàn)的實(shí)現(xiàn)

    Java基于drools做規(guī)則校驗(yàn)的實(shí)現(xiàn)

    工作中需要開發(fā)一個(gè)規(guī)則服務(wù),提供各種規(guī)則,本文主要介紹了Java基于drools做規(guī)則校驗(yàn)的實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-03-03
  • java——多線程基礎(chǔ)

    java——多線程基礎(chǔ)

    Java多線程實(shí)現(xiàn)方式有兩種,第一種是繼承Thread類,第二種是實(shí)現(xiàn)Runnable接口,兩種有很多差異,下面跟著本文一起學(xué)習(xí)吧,希望能給你帶來幫助
    2021-07-07
  • mybatis寫xml時(shí)數(shù)字類型千萬別用 !=‘‘(不為空串)進(jìn)行判斷的示例詳解

    mybatis寫xml時(shí)數(shù)字類型千萬別用 !=‘‘(不為空串)進(jìn)行判斷的示例詳解

    這篇文章主要介紹了mybatis寫xml時(shí)數(shù)字類型千萬別用 !=‘‘(不為空串)進(jìn)行判斷的示例詳解,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-09-09
  • Spring?Boot項(xiàng)目傳參校驗(yàn)的最佳實(shí)踐指南

    Spring?Boot項(xiàng)目傳參校驗(yàn)的最佳實(shí)踐指南

    有參數(shù)傳遞的地方都少不了參數(shù)校驗(yàn),在web開發(fā)中前端的參數(shù)校驗(yàn)是為了用戶體驗(yàn),后端的參數(shù)校驗(yàn)是為了安全,下面這篇文章主要給大家介紹了關(guān)于Spring?Boot項(xiàng)目傳參校驗(yàn)的最佳實(shí)踐,需要的朋友可以參考下
    2022-04-04

最新評(píng)論